SQLSTATE
Contents
Handling Errors
The error returned from query()
will always one of the SQLState
struct
types. Each type describes the error situation, but may also contain specific
fields appropriate for that error. See
sqlstate.v
for struct definitions.
You can match on these to inspect the error further:
db.query('SELECT * FROM bar') or {
match err {
vsql.SQLState42P01 { // 42P01 = table not found
println("I knew '${err.entity_name}' did not exist!")
}
else { panic(err) }
}
}
The err.code()
contains the integer representation of the SQLSTATE:
db.query('SELECT * FROM bar') or {
sqlstate := vsql.sqlstate_from_int(err.code())
println('$sqlstate: $err.msg()')
// 42P01: no such table: BAR
if err.code() == vsql.sqlstate_to_int('42P01') {
println('table does not exist')
}
}
Or handling errors by class (first two letters):
db.query('SELECT * FROM bar') or {
if err.code() >= vsql.sqlstate_to_int('42000') &&
err.code() <= vsql.sqlstate_to_int('42ZZZ') {
println('Class 42 — Syntax Error or Access Rule Violation')
}
}
SQLSTATE
0B000
invalid transaction initiation
0B000
is caused when attempting to START TRANSACTION
but there pool of
in-flight transactions is full.
22001
string data right truncation
This means a character value is trying to be converted to a type that is not large enough to store it.
Examples
CREATE TABLE foo (x CHARACTER VARYING(8));
INSERT INTO foo (x) VALUES ('hello');
SELECT CAST(x AS VARCHAR(4)) FROM foo;
-- msg: CREATE TABLE 1
-- msg: INSERT 1
-- error 22001: string data right truncation for CHARACTER VARYING(4)
22003
numeric value out of range
Examples
CREATE TABLE foo (x SMALLINT);
INSERT INTO foo (x) VALUES (-32769);
-- error 22003: numeric value out of range
2200H
sequence generator limit exceeded
Examples
CREATE SEQUENCE seq1 START WITH 10 INCREMENT BY 5 MAXVALUE 20 NO CYCLE;
VALUES NEXT VALUE FOR seq1;
VALUES NEXT VALUE FOR seq1;
VALUES NEXT VALUE FOR seq1;
VALUES NEXT VALUE FOR seq1;
-- msg: CREATE SEQUENCE 1
-- COL1: 10
-- COL1: 15
-- COL1: 20
-- error 2200H: sequence generator limit exceeded: PUBLIC.SEQ1
22012
division by zero
Examples
SELECT 2.5 / 0;
-- error 22012: division by zero
23502
violates not-null constraint
Examples
CREATE TABLE t1 (f1 CHARACTER VARYING(10) NULL, f2 FLOAT NOT NULL);
INSERT INTO t1 (f1, f2) VALUES ('a', NULL);
-- msg: CREATE TABLE 1
-- error 23502: violates non-null constraint: column F2
25001
invalid transaction state: active sql transaction
25001
is caused by a transaction state transition that is not legal on an
already active transaction.
Examples
START TRANSACTION;
START TRANSACTION;
-- error 25001: invalid transaction state: active sql transaction
25P02
in failed sql transaction
25P02
will be returned for all commands within a transaction after a failure
of a previous SQL statement. You must COMMIT
or ROLLBACK
, however,
COMMIT
will be treated as a ROLLBACK
.
Examples
CREATE TABLE foo (b BOOLEAN);
INSERT INTO foo (b) VALUES (123, 456);
SELECT * FROM foo;
-- msg: CREATE TABLE 1
-- error 42601: syntax error: INSERT has more values than columns
-- error 25P02: transaction is aborted, commands ignored until end of transaction block
2BP01
dependent objects still exist
2BP01
occurs if trying to drop a schema with RESTRICT
and there are
still objects that exist in the schema.
2D000
invalid transaction termination
2D000
is caused by a transaction state transition that is not legal when not
in an active transaction.
Examples
START TRANSACTION;
COMMIT;
COMMIT;
-- error 2D000: invalid transaction termination
3D000
invalid catalog name
3D000
occurs if the catalog does not exist or is otherwise invalid.
3F000
invalid schema name
3F000
occurs if the schema does not exist or is otherwise invalid.
40001
serialization failure
40001
occurs if concurrent transactions attempt to update the same row. If
allowed, this would lead to an inconsistency. It’s possible that this also might
be a deadlock in some situations. However, the deadlock is always avoided
because the current transaction that receives this error will be rolled back.
A client that receives this error should retry the transaction.
42601
syntax error
Examples
TABLE;
-- error 42601: syntax error: at "TABLE"
CREATE TABLE foo (b BOOLEAN);
INSERT INTO foo (b) VALUES (123, 456);
-- msg: CREATE TABLE 1
-- error 42601: syntax error: INSERT has more values than columns
CREATE TABLE ABS (x INT);
-- error 42601: syntax error: table name cannot be reserved word: ABS
42703
column does not exist
Examples
CREATE TABLE foo (b BOOLEAN);
INSERT INTO foo (c) VALUES (true);
-- msg: CREATE TABLE 1
-- error 42703: no such column: C
42804
data type mismatch
Examples
SELECT 123 || 'bar';
-- error 42804: data type mismatch cannot INTEGER || CHARACTER VARYING: expected another type but got INTEGER and CHARACTER VARYING
CREATE TABLE foo (b BOOLEAN);
INSERT INTO foo (b) VALUES (123);
-- msg: CREATE TABLE 1
-- error 42804: data type mismatch for column B: expected BOOLEAN but got INTEGER
42846
cannot coerce
Examples
VALUES CAST(123 AS BOOLEAN);
-- error 42846: cannot coerce SMALLINT to BOOLEAN
42883
function does not exist
Examples
SELECT ABS();
-- error 42883: function does not exist: ABS has 0 arguments but needs 1 argument
SELECT ABS(1, 2);
-- error 42883: function does not exist: ABS has 2 arguments but needs 1 argument
42P01
table does not exist
Examples
DELETE FROM foo;
-- error 42P01: no such table: FOO
42P02
parameter does not exist
Examples
CREATE TABLE t1 (x FLOAT);
INSERT INTO t1 (x) VALUES (:foo);
-- error 42P02: no such parameter: foo
42P06
schema already exists
Examples
CREATE TABLE foo;
CREATE TABLE foo;
-- msg: CREATE SCHEMA 1
-- error 42P06: duplicate schema: FOO
42P07
table already exists
Examples
CREATE TABLE foo (x FLOAT);
CREATE TABLE foo (baz CHARACTER VARYING(10));
-- msg: CREATE TABLE 1
-- error 42P07: duplicate table: FOO