MCPcopy Create free account
hub / github.com/PostHog/duckgres / TestClassifyErrorCodeAgainstRealDuckDB

Function TestClassifyErrorCodeAgainstRealDuckDB

server/transient_test.go:444–500  ·  view source on GitHub ↗

TestClassifyErrorCodeAgainstRealDuckDB drives queries that reliably produce each error prefix the classifier branches on, against a real in-memory DuckDB, and asserts the SQLSTATE we map to.

(t *testing.T)

Source from the content-addressed store, hash-verified

442// produce each error prefix the classifier branches on, against a real
443// in-memory DuckDB, and asserts the SQLSTATE we map to.
444func TestClassifyErrorCodeAgainstRealDuckDB(t *testing.T) {
445 db, err := sql.Open("duckdb", ":memory:")
446 if err != nil {
447 t.Fatalf("open duckdb: %v", err)
448 }
449 defer func() { _ = db.Close() }()
450
451 if _, err := db.Exec(`CREATE TABLE t (id INTEGER PRIMARY KEY, v INTEGER NOT NULL)`); err != nil {
452 t.Fatalf("setup create: %v", err)
453 }
454 if _, err := db.Exec(`INSERT INTO t VALUES (1, 1)`); err != nil {
455 t.Fatalf("setup insert: %v", err)
456 }
457
458 cases := []struct {
459 name string
460 query string
461 wantCode string
462 }{
463 {"missing table", `SELECT * FROM no_such_table_xyz`, "42P01"},
464 {"missing column", `SELECT no_such_col FROM t`, "42703"},
465 {"parser syntax", `SELEC 1`, "42601"},
466 {"bad cast", `SELECT CAST('abc' AS INTEGER)`, "22P02"},
467 {"cast overflow", `SELECT CAST(1000 AS TINYINT)`, "22003"},
468 {"unique violation", `INSERT INTO t VALUES (1, 2)`, "23505"},
469 {"not null violation", `INSERT INTO t (id) VALUES (2)`, "23502"},
470 }
471
472 for _, tc := range cases {
473 t.Run(tc.name, func(t *testing.T) {
474 _, err := db.Exec(tc.query)
475 if err == nil {
476 t.Fatalf("expected error from %q, got nil", tc.query)
477 return
478 }
479 if got := classifyErrorCode(err); got != tc.wantCode {
480 t.Fatalf("classifyErrorCode for %q = %q, want %q (raw err: %v)", tc.query, got, tc.wantCode, err)
481 }
482 })
483 }
484
485 t.Run("nested begin", func(t *testing.T) {
486 if _, err := db.Exec(`BEGIN`); err != nil {
487 t.Fatalf("outer begin: %v", err)
488 }
489 defer func() { _, _ = db.Exec(`ROLLBACK`) }()
490
491 _, err := db.Exec(`BEGIN`)
492 if err == nil {
493 t.Fatal("expected error on nested BEGIN, got nil")
494 return
495 }
496 if got := classifyErrorCode(err); got != "25000" {
497 t.Fatalf("nested BEGIN SQLSTATE = %q, want %q (raw err: %v)", got, "25000", err)
498 }
499 })
500}
501

Callers

nothing calls this directly

Calls 5

classifyErrorCodeFunction · 0.85
CloseMethod · 0.65
ExecMethod · 0.65
RunMethod · 0.65
OpenMethod · 0.45

Tested by

no test coverage detected