sijms / go-ora

Pure go oracle client
MIT License
767 stars 168 forks source link

Connection error on v2.8.12 #545

Closed elgs closed 2 months ago

elgs commented 2 months ago

I got the following error after upgrading to v2.8.12, which worked without a problem on v2.8.11.

The code I use to connect to the db looks something like this:

urlString := "oracle://admin:password@:0/?SSL VERIFY=FALSE&connStr=(description=(retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=xxxxxxxxxxxxxx.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxx.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)))"

conn, err = sql.Open("oracle", urlString)
--- FAIL: TestAPITestSuite (0.00s)
    panic.go:261: test panicked: runtime error: invalid memory address or nil pointer dereference
        goroutine 5 [running]:
        runtime/debug.Stack()
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/runtime/debug/stack.go:24 +0x64
        github.com/stretchr/testify/suite.failOnPanic(0x1400007a820, {0x102724ce0, 0x102e70580})
                /Users/qianchen/go/pkg/mod/github.com/stretchr/testify@v1.9.0/suite/suite.go:89 +0x38
        github.com/stretchr/testify/suite.recoverAndFailOnPanic(0x1400007a820)
                /Users/qianchen/go/pkg/mod/github.com/stretchr/testify@v1.9.0/suite/suite.go:83 +0x40
        panic({0x102724ce0?, 0x102e70580?})
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/runtime/panic.go:770 +0x124
        github.com/sijms/go-ora/v2/network.(*Session).Connect(0x14000105a40, {0x102825e00, 0x102efa380})
                /Users/qianchen/go/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/network/session.go:490 +0xf0
        github.com/sijms/go-ora/v2.(*Connection).OpenWithContext(0x140000b2a08, {0x102825e00, 0x102efa380})
                /Users/qianchen/go/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/connection.go:412 +0x53c
        github.com/sijms/go-ora/v2.(*OracleConnector).Connect(0x14000268e10, {0x102825e00, 0x102efa380})
                /Users/qianchen/go/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/connection.go:134 +0x148
        database/sql.(*DB).conn(0x1400017f930, {0x102825e00, 0x102efa380}, 0x1)
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/database/sql/sql.go:1415 +0x824
        database/sql.(*DB).query(0x1400017f930, {0x102825e00, 0x102efa380}, {0x101863d0e, 0x1b}, {0x0, 0x0, 0x0}, 0x10?)
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/database/sql/sql.go:1749 +0x40
        database/sql.(*DB).QueryContext.func1(0x30?)
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/database/sql/sql.go:1732 +0x54
        database/sql.(*DB).retry(0x14000289958?, 0x14000289950)
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/database/sql/sql.go:1566 +0x4c
        database/sql.(*DB).QueryContext(0x10?, {0x102825e00?, 0x102efa380?}, {0x101863d0e?, 0x0?}, {0x0?, 0x14000289a18?, 0x10179c814?})
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/database/sql/sql.go:1731 +0x94
        database/sql.(*DB).QueryRowContext(...)
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/database/sql/sql.go:1832
        database/sql.(*DB).QueryRow(0x10184eb89?, {0x101863d0e?, 0x140001a1040?}, {0x0?, 0x1?, 0x102e92860?})
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/database/sql/sql.go:1846 +0x48
        github.com/elgs/gosqlcrud.GetDbType({0x102823510, 0x1400017f930})
                /Users/qianchen/go/pkg/mod/github.com/elgs/gosqlcrud@v0.0.0-20240405131937-de90abf1755a/gosqlcrud.go:455 +0xc8
        github.com/elgs/gosqlapi.(*Database).GetConn(0x14000268d80)
                /Users/qianchen/code/go/gosqlapi/gosqlapi.go:109 +0x1ec
        github.com/elgs/gosqlapi.(*App).GetDatabase(0x1400003e7e0?, {0x140001a1030, 0x7})
                /Users/qianchen/code/go/gosqlapi/gosqlapi.go:82 +0x54
        github.com/elgs/gosqlapi.(*App).buildTokenQuery(0x1400023d8b0)
                /Users/qianchen/code/go/gosqlapi/gosqlapi.go:234 +0x418
        github.com/elgs/gosqlapi.NewApp({0x140001ca480, 0x461, 0x462})
                /Users/qianchen/code/go/gosqlapi/gosqlapi.go:27 +0x60
        github.com/elgs/gosqlapi.(*APITestSuite).SetupSuite(0x1400011c700)
                /Users/qianchen/code/go/gosqlapi/api_test.go:58 +0xe8
        github.com/stretchr/testify/suite.Run(0x1400007a820, {0x1028234b0, 0x1400011c700})
                /Users/qianchen/go/pkg/mod/github.com/stretchr/testify@v1.9.0/suite/suite.go:157 +0x5d4
        github.com/elgs/gosqlapi.TestAPITestSuite(0x1400007a820)
                /Users/qianchen/code/go/gosqlapi/api_test.go:43 +0x74
        testing.tRunner(0x1400007a820, 0x102816710)
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/testing/testing.go:1689 +0xec
        created by testing.(*T).Run in goroutine 1
                /opt/homebrew/Cellar/go/1.22.2/libexec/src/testing/testing.go:1742 +0x318
FAIL
exit status 1
freeNestor commented 2 months ago

+1 same issue

2024-04-23 panic: runtime error: invalid memory address or nil pointer dereference
2024-04-23 [signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0xd3ee87]
2024-04-23 
2024-04-23 goroutine 1 [running]:
2024-04-23 github.com/sijms/go-ora/v2/network.(*Session).Connect(0xc0003eaa80, {0x12c4270, 0xc0003d1420})
2024-04-23  /gopath/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/network/session.go:490 +0x127
2024-04-23 github.com/sijms/go-ora/v2.(*Connection).OpenWithContext(0xc00026cf08, {0x12c4270, 0xc0003d1420})
2024-04-23  /gopath/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/connection.go:412 +0x6d7
2024-04-23 github.com/sijms/go-ora/v2.(*OracleConnector).Connect(0xc00041aea0, {0x12c4270, 0xc0003d1420})
2024-04-23  /gopath/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/connection.go:134 +0x15e
2024-04-23 database/sql.(*DB).conn(0xc000377110, {0x12c4270, 0xc0003d1420}, 0x1)
2024-04-23  /usr/local/go/src/database/sql/sql.go:1415 +0x71e
2024-04-23 database/sql.(*DB).Conn.func1(0x0?)
2024-04-23  /usr/local/go/src/database/sql/sql.go:1940 +0x3a
2024-04-23 database/sql.(*DB).retry(0x12c4270?, 0xc00004d750)
2024-04-23  /usr/local/go/src/database/sql/sql.go:1566 +0x42
2024-04-23 database/sql.(*DB).Conn(0xc000377110, {0x12c4270?, 0xc0003d1420?})
...
iTanken commented 2 months ago

➕1️⃣

https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002 https://github.com/godoes/gorm-oracle/pull/22

Failed Job Details ```shell panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0x745055] goroutine 1 [running]: github.com/sijms/go-ora/v2/network.(*Session).Connect(0xc000228000, {0xa6ceb8, 0xc000032150}) /home/runner/go/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/network/session.go:4[9](https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002#step:8:10)0 +0x135 github.com/sijms/go-ora/v2.(*Connection).OpenWithContext(0xc000224240, {0xa6ceb8, 0xc000032150}) /home/runner/go/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/connection.go:412 +0x765 github.com/sijms/go-ora/v2.(*OracleConnector).Connect(0xc0002[10](https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002#step:8:11)0c0, {0xa6ceb8, 0xc000032150}) /home/runner/go/pkg/mod/github.com/sijms/go-ora/v2@v2.8.[12](https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002#step:8:13)/connection.go:134 +0x169 database/sql.(*DB).conn(0xc0002120d0, {0xa6ceb8, 0xc000032150}, 0x1) /opt/hostedtoolcache/go/1.20.14/x64/src/database/sql/sql.go:[13](https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002#step:8:14)87 +0x763 database/sql.(*DB).exec(0x907140?, {0xa6ceb8, 0xc000032150}, {0xc000220030, 0x25}, {0x0, 0x0, 0x0}, 0xe7?) /opt/hostedtoolcache/go/1.20.[14](https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002#step:8:15)/x64/src/database/sql/sql.go:1651 +0x5d database/sql.(*DB).ExecContext.func1(0x65?) /opt/hostedtoolcache/go/1.20.14/x64/src/database/sql/sql.go:1634 +0x55 database/sql.(*DB).retry(0xc0000f58c8?, 0xc0000f58c8) /opt/hostedtoolcache/go/1.20.14/x64/src/database/sql/sql.go:[15](https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002#step:8:16)38 +0x47 database/sql.(*DB).ExecContext(0x9aa916?, {0xa6ceb8?, 0xc000032150?}, {0xc000220030?, 0x2?}, {0x0?, 0xa6a8e0?, 0xc0002100c0?}) /opt/hostedtoolcache/go/1.20.14/x64/src/database/sql/sql.go:[16](https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002#step:8:17)33 +0xcc database/sql.(*DB).Exec(...) /opt/hostedtoolcache/go/1.20.14/x64/src/database/sql/sql.go:1647 github.com/sijms/go-ora/v2.AddSessionParam(0xc0002120d0, {0x9a0748, 0x8}, {0x9a1ae9, 0xa}) /home/runner/go/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/driver.go:104 +0x10f github.com/godoes/gorm-oracle.Dialector.Initialize({0x93bee0?}, 0xc000210030) /home/runner/work/gorm-oracle/gorm-oracle/oracle.go:222 +0x388 gorm.io/gorm.Open({0xa6edf8?, 0xc000202000}, {0xc000208000, 0x1, 0x1}) /home/runner/go/pkg/mod/gorm.io/gorm@v1.25.9/gorm.go:[18](https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002#step:8:19)2 +0x9ae github.com/godoes/gorm-oracle.openTestConnection(0x1, 0x1) /home/runner/work/gorm-oracle/gorm-oracle/oracle_test.go:44 +0x154 github.com/godoes/gorm-oracle.init.0() /home/runner/work/gorm-oracle/gorm-oracle/oracle_test.go:33 +0x91 FAIL github.com/godoes/gorm-oracle 300.009s FAIL Error: Process completed with exit code 1. ```
sijms commented 2 months ago

I am fixing

sijms commented 2 months ago

fixed 2.8.13

freeNestor commented 2 months ago

connection issue is fixed, but a new problem is produced in my environment with new version 2.8.13. 2.8.11 is ok.

query column info error: ORA-01009: missing mandatory parameter\n - sql: SELECT * FROM testdbuser.testshort WHERE ID=:1
sijms commented 2 months ago

the following code run without error:

package main

import (
    "database/sql"
    "fmt"
    go_ora "github.com/sijms/go-ora/v2"
    "os"
    "strconv"
    "time"
)

type TTB_DATA struct {
    Id   int64     `db:"ID"`
    Name string    `db:"NAME"`
    Val  float64   `db:"VAL"`
    Date time.Time `db:"LDATE"`
}

func execCmd(db *sql.DB, stmts ...string) error {
    for _, stmt := range stmts {
        if _, err := db.Exec(stmt); err != nil {
            if len(stmts) > 1 {
                return fmt.Errorf("error: %v in execuation of stmt: %s", err, stmt)
            } else {
                return err
            }
        }
    }
    return nil
}

func createTable(db *sql.DB) error {
    t := time.Now()
    err := execCmd(db, `CREATE TABLE TTB_545(
    ID          number(10)  NOT NULL,
    NAME        VARCHAR(200),
    VAL         number(10,2),
    LDATE   date,
    PRIMARY KEY(ID)
    )`)
    if err != nil {
        return err
    }
    fmt.Println("Finish create table :", time.Now().Sub(t))
    return nil
}

func dropTable(db *sql.DB) error {
    t := time.Now()
    err := execCmd(db, "drop table TTB_545 purge")
    if err != nil {
        return err
    }
    fmt.Println("Finish drop table: ", time.Now().Sub(t))
    return nil
}

func insert(conn *sql.DB, count int) error {
    t := time.Now()
    data := make([]TTB_DATA, count)
    for x := 0; x < count; x++ {
        data[x].Id = int64(1 + x)
        data[x].Name = "test_ " + strconv.Itoa(x+1)
        data[x].Val = 100.23 + 1
        data[x].Date = time.Now()

    }
    _, err := conn.Exec("INSERT INTO TTB_545 (ID, NAME, VAL, LDATE) VALUES(:ID, :NAME, :VAL, :LDATE)", data)
    if err != nil {
        return err
    }
    fmt.Println("Finish insert data: ", time.Now().Sub(t))
    return nil
}

func main() {
    config, err := go_ora.ParseConfig(os.Getenv("DSN"))
    if err != nil {
        fmt.Println("can't parse config:", err)
        return
    }
    go_ora.RegisterConnConfig(config)
    db, err := sql.Open("oracle", "")
    if err != nil {
        fmt.Println("can't open db:", err)
        return
    }
    defer func() {
        err = db.Close()
        if err != nil {
            fmt.Println("can't close db:", err)
        }
    }()
    err = createTable(db)
    if err != nil {
        fmt.Println("can't create table:", err)
        return
    }
    defer func() {
        err = dropTable(db)
        if err != nil {
            fmt.Println("can't drop table:", err)
        }
    }()
    err = insert(db, 100)
    if err != nil {
        fmt.Println("can't insert data:", err)
        return
    }
    rows, err := db.Query("SELECT * FROM TTB_545 where id = :1", 1)
    if err != nil {
        fmt.Println("can't query rows:", err)
        return
    }
    defer func() {
        err = rows.Close()
        if err != nil {
            fmt.Println("can't close rows:", err)
        }
    }()
}
freeNestor commented 2 months ago

Sorry, test it, my table is little different and includes clob column. This code will produce error.

Finish create table : 2.871612167s
Finish insert data:  21.6205ms
can't query rows: ORA-01009: missing mandatory parameter

Finish drop table:  48.876541ms
package main

import (
    "context"
    "fmt"
    "strconv"
    "time"

    "github.com/jmoiron/sqlx"
    go_ora "github.com/sijms/go-ora/v2"
)

type TTB_DATA struct {
    Id       int64     `db:"ID"`
    Name     string    `db:"NAME"`
    Val      float64   `db:"VAL"`
    Clobtest string    `db:"CLOBTEST"`
    Date     time.Time `db:"LDATE"`
}

func execCmd(db *sqlx.DB, stmts ...string) error {
    for _, stmt := range stmts {
        if _, err := db.Exec(stmt); err != nil {
            if len(stmts) > 1 {
                return fmt.Errorf("error: %v in execuation of stmt: %s", err, stmt)
            } else {
                return err
            }
        }
    }
    return nil
}

func createTable(db *sqlx.DB) error {
    t := time.Now()
    err := execCmd(db, `CREATE TABLE TTB_545(
    ID          number(10)  NOT NULL,
    NAME        VARCHAR(200),
    VAL         number(10,2),
    CLOBTEST    CLOB,
    LDATE   date,
    PRIMARY KEY(ID)
    )`)
    if err != nil {
        return err
    }
    fmt.Println("Finish create table :", time.Now().Sub(t))
    return nil
}

func dropTable(db *sqlx.DB) error {
    t := time.Now()
    err := execCmd(db, "drop table TTB_545 purge")
    if err != nil {
        return err
    }
    fmt.Println("Finish drop table: ", time.Now().Sub(t))
    return nil
}

func insert(conn *sqlx.DB, count int) error {
    t := time.Now()
    data := make([]TTB_DATA, count)
    for x := 0; x < count; x++ {
        data[x].Id = int64(1 + x)
        data[x].Name = "test_ " + strconv.Itoa(x+1)
        data[x].Val = 100.23 + 1
        data[x].Clobtest = "ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
        data[x].Date = time.Now()

    }
    _, err := conn.Exec("INSERT INTO TTB_545 (ID, NAME, VAL,CLOBTEST, LDATE) VALUES(:ID, :NAME, :VAL,:CLOBTEST, :LDATE)", data)
    if err != nil {
        return err
    }
    fmt.Println("Finish insert data: ", time.Now().Sub(t))
    return nil
}

func main() {
    options := map[string]string{
        "TIMEOUT":            "60",
        "CONNECTION TIMEOUT": "5",
    }
    dsn := go_ora.BuildUrl(host, 1521, "orcldb", "test", "test123", options)

    conn, err := sqlx.Open("oracle", dsn)
    if err != nil {
        fmt.Printf("create oracle connection pool error: %v\n", err)
        return
    }

    defer func() {
        err = conn.Close()
        if err != nil {
            fmt.Println("can't close db:", err)
        }
    }()
    err = createTable(conn)
    if err != nil {
        fmt.Println("can't create table:", err)
        return
    }
    defer func() {
        err = dropTable(conn)
        if err != nil {
            fmt.Println("can't drop table:", err)
        }
    }()
    err = insert(conn, 100)
    if err != nil {
        fmt.Println("can't insert data:", err)
        return
    }
    ctxTimeout, cancel := context.WithTimeout(context.Background(), time.Second*10)
    defer cancel()
    rows, err := conn.QueryxContext(ctxTimeout, "SELECT * FROM TTB_545 where id = :1", 1)
    if err != nil {
        fmt.Println("can't query rows:", err)
        return
    }
    defer func() {
        err = rows.Close()
        if err != nil {
            fmt.Println("can't close rows:", err)
        }
    }()
}
sijms commented 2 months ago

fixed in next release

sijms commented 2 months ago

fixed v2.8.14

freeNestor commented 2 months ago

Test. This error is gone.