nakagami / firebirdsql

Firebird RDBMS sql driver for Go (golang)
MIT License
227 stars 60 forks source link

stmt.QueryRowContext().Scan() returns io.EOF #141

Closed runningmaster closed 2 years ago

runningmaster commented 2 years ago

Prepared statemet for select query returns io.EOF error after second QueryRow()).Scan() inside for loop.

func stmtEOF(db *sql.DB) error {
    query := "SELECT 1 AS ID FROM RDB$DATABASE WHERE 0 < ?"

    tx, err := db.Begin()
    if err != nil {
        return err
    }
    defer func() { _ = tx.Commit() }()

    ctx := context.Background()

    stmt, err := tx.PrepareContext(ctx, query)
    if err != nil {
        return err
    }

    defer func() { _ = stmt.Close() }()

    for _, v := range []int{1, 2, 3} {
        var x int

        err = stmt.QueryRowContext(ctx, v).Scan(&x)
        if err != nil {
            fmt.Println(v, err)
            return err
        }

        fmt.Println(x)
    }

    return nil
}

fmt.Println() prints:

1
2 EOF

insted of

1
1
1

This error occurs here:

func (rows *firebirdsqlRows) Next(dest []driver.Value) (err error) {
...
    if rows.currentChunkRow == nil {
        err = io.EOF
        return
    }
...

https://github.com/nakagami/firebirdsql/blob/803b00772b9107746fa9081fb8beb70081ff6e81/rows.go#L104

What do I do wrong?

runningmaster commented 2 years ago

What do I do wrong?

Sorry, I was wrong.

-       err = stmt.QueryRowContext(ctx, v).Scan(&x)
+       err = tx.StmtContext(ctx, stmt).QueryRowContext(ctx, v).Scan(&x)
runningmaster commented 2 years ago

This issue is invalid.