executeBoundPlan is a QueryExecutor that calls QueryWithBindings on the given engine using the given query and parsed statement, which may be nil.
(ctx *sql.Context, query string, _ tree.Statement, stmt *duckdb.Stmt, vars []any)
| 490 | // return h.e.QueryWithBindings(ctx, query, parsed, nil, nil) |
| 491 | |
| 492 | sql.IncrementStatusVariable(ctx, "Questions", 1) |
| 493 | if _, ok := parsed.(*tree.Select); ok { |
| 494 | sql.IncrementStatusVariable(ctx, "Com_select", 1) |
| 495 | } |
| 496 | |
| 497 | var ( |
| 498 | schema sql.Schema |
| 499 | iter sql.RowIter |
| 500 | rows *stdsql.Rows |
| 501 | result stdsql.Result |
| 502 | err error |
| 503 | ) |
| 504 | |
| 505 | // NOTE: The query is parsed using Postgres parser, which does not support all DuckDB syntax. |
| 506 | // Consequently, the following classification is not perfect. |
| 507 | switch parsed := parsed.(type) { |
| 508 | case *tree.BeginTransaction, *tree.CommitTransaction, *tree.RollbackTransaction, |
| 509 | *tree.CreateTable, *tree.DropTable, *tree.AlterTable, *tree.CreateIndex, *tree.DropIndex, |
| 510 | *tree.Update, *tree.Delete, *tree.Truncate, *tree.CopyFrom, *tree.CopyTo, *tree.SetVar: |
| 511 | result, err = adapter.Exec(ctx, query) |
| 512 | if err != nil { |
| 513 | break |
| 514 | } |
| 515 | affected, _ := result.RowsAffected() |
| 516 | insertId, _ := result.LastInsertId() |
| 517 | schema = types.OkResultSchema |
| 518 | iter = sql.RowsToRowIter(sql.NewRow(types.OkResult{ |
| 519 | RowsAffected: uint64(affected), |
| 520 | InsertID: uint64(insertId), |
| 521 | })) |
| 522 | case *tree.Insert: |
| 523 | if _, ok := postgresInsertReturningRows(parsed); ok { |
| 524 | rows, err = adapter.QueryCatalog(ctx, query) |
| 525 | if err != nil { |
| 526 | break |
| 527 | } |
| 528 | schema, err = pgtypes.InferSchema(rows) |
| 529 | if err != nil { |
| 530 | rows.Close() |
| 531 | break |
| 532 | } |
| 533 | iter, err = backend.NewSQLRowIter(rows, schema) |
| 534 | if err != nil { |
| 535 | rows.Close() |
| 536 | } |
| 537 | break |
| 538 | } |
| 539 | result, err = adapter.Exec(ctx, query) |
| 540 | if err != nil { |
| 541 | break |
| 542 | } |
| 543 | affected, _ := result.RowsAffected() |
| 544 | insertID, _ := result.LastInsertId() |
| 545 | schema = types.OkResultSchema |
| 546 | iter = sql.RowsToRowIter(sql.NewRow(types.OkResult{ |
| 547 | RowsAffected: uint64(affected), |
| 548 | InsertID: uint64(insertID), |
| 549 | })) |
nothing calls this directly
no test coverage detected