executeQuery 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, parsed tree.Statement, _ *duckdb.Stmt, _ []any)
| 404 | // executeQuery is a QueryExecutor that calls QueryWithBindings on the given engine using the given query and parsed |
| 405 | // statement, which may be nil. |
| 406 | func (h *DuckHandler) executeQuery(ctx *sql.Context, query string, parsed tree.Statement, _ *duckdb.Stmt, _ []any) (sql.Schema, sql.RowIter, *sql.QueryFlags, error) { |
| 407 | // return h.e.QueryWithBindings(ctx, query, parsed, nil, nil) |
| 408 | |
| 409 | sql.IncrementStatusVariable(ctx, "Questions", 1) |
| 410 | if _, ok := parsed.(*tree.Select); ok { |
| 411 | sql.IncrementStatusVariable(ctx, "Com_select", 1) |
| 412 | } |
| 413 | |
| 414 | var ( |
| 415 | schema sql.Schema |
| 416 | iter sql.RowIter |
| 417 | rows *stdsql.Rows |
| 418 | result stdsql.Result |
| 419 | err error |
| 420 | ) |
| 421 | |
| 422 | // NOTE: The query is parsed using Postgres parser, which does not support all DuckDB syntax. |
| 423 | // Consequently, the following classification is not perfect. |
| 424 | switch parsed.(type) { |
| 425 | case *tree.BeginTransaction, *tree.CommitTransaction, *tree.RollbackTransaction, |
| 426 | *tree.CreateTable, *tree.DropTable, *tree.AlterTable, *tree.CreateIndex, *tree.DropIndex, |
| 427 | *tree.Insert, *tree.Update, *tree.Delete, *tree.Truncate, *tree.CopyFrom, *tree.CopyTo, *tree.SetVar: |
| 428 | result, err = adapter.Exec(ctx, query) |
| 429 | if err != nil { |
| 430 | break |
| 431 | } |
| 432 | affected, _ := result.RowsAffected() |
| 433 | insertId, _ := result.LastInsertId() |
| 434 | schema = types.OkResultSchema |
| 435 | iter = sql.RowsToRowIter(sql.NewRow(types.OkResult{ |
| 436 | RowsAffected: uint64(affected), |
| 437 | InsertID: uint64(insertId), |
| 438 | })) |
| 439 | case *tree.CreateDatabase: |
| 440 | provider := h.GetCatalogProvider() |
| 441 | if provider == nil { |
| 442 | err = fmt.Errorf("database provider not found") |
| 443 | break |
| 444 | } |
| 445 | p := parsed.(*tree.CreateDatabase) |
| 446 | dbName := p.Name.String() |
| 447 | err = provider.CreateCatalog(dbName, p.IfNotExists) |
| 448 | if err != nil { |
| 449 | break |
| 450 | } |
| 451 | schema = types.OkResultSchema |
| 452 | iter = sql.RowsToRowIter(sql.NewRow(types.OkResult{})) |
| 453 | case *tree.DropDatabase: |
| 454 | provider := h.GetCatalogProvider() |
| 455 | if provider == nil { |
| 456 | err = fmt.Errorf("database provider not found") |
| 457 | break |
| 458 | } |
| 459 | p := parsed.(*tree.DropDatabase) |
| 460 | dbName := parsed.(*tree.DropDatabase).Name.String() |
| 461 | err = provider.DropCatalog(dbName, p.IfExists) |
| 462 | if err != nil { |
| 463 | break |
nothing calls this directly
no test coverage detected