mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-24 19:44:21 +01:00
4.0 KiB
4.0 KiB
Extra consistency checks
ALTER TABLE ... RENAME TO ...when old and new table names are the same =>Stmt::checkALTER TABLE ... ADD COLUMN ...with new primary key / unique constraint =>Stmt::checkCREATE TABLE ...- with duplicated column name =>
ColumnDefinition::add_column - with STRICT option and invalid or missing column type(s) =>
CreateTableBody::check - WITHOUT ROWID and without primary key =>
CreateTableBody::check
- with duplicated column name =>
CREATE VIEW ... (...) ...- when view columns count does not match select columns count =>
Stmt::check - with duplicated columns (same name) =>
Stmt::check
- when view columns count does not match select columns count =>
DELETE FROM ... ORDER BY ...with ORDER BY but without LIMIT =>Stmt::checkINSERT INTO ... (...) ...when columns count does not match select columns / values count =>Stmt::checkINSERT INTO ... (...) DEFAULT VALUESwith columns and DEFAULT VALUES =>Stmt::checkSELECT ... EXCEPT|INTERSECT|UNION SELECT ...when all SELECT does not have the same number of result columns =>SelectBody::pushNATURAL JOIN ...with ON or USING clause =>FromClause::pushUPDATE ... ORDER BY ...with ORDER BY but without LIMIT =>Stmt::checkVALUES (...), (...), ...when all VALUES does not have the same number of terms =>OneSelect::pushWITH ...with duplicated table name =>CommonTableExpr::add_cte
TODO
CREATE TABLE
- qualified (different of
temp) temporary table
sqlite> ATTACH DATABASE ':memory:' AS mem;
sqlite> CREATE TEMPORARY TABLE mem.x AS SELECT 1;
Parse error: temporary table name must be unqualified
sqlite> CREATE TEMPORARY TABLE temp.x AS SELECT 1;
-- OK
- must have at least one non-generated column
sqlite> CREATE TABLE test(data AS (1));
Parse error: must have at least one non-generated column
- column constraint(s) checks
sqlite> CREATE TABLE t(a REFERENCES o(a,b));
Parse error: foreign key on a should reference only one column of table o
CREATE TABLE t(a REFERENCES o(a,b));
error here ---^
sqlite> CREATE TABLE t(a PRIMARY KEY AUTOINCREMENT) WITHOUT ROWID;
Parse error: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY
sqlite> CREATE TABLE t(a INTEGER PRIMARY KEY AUTOINCREMENT) WITHOUT ROWID;
Parse error: AUTOINCREMENT not allowed on WITHOUT ROWID tables
- table constraint(s) checks
sqlite> CREATE TABLE test (a, b, FOREIGN KEY (b) REFERENCES test(a,b));
Parse error: number of columns in foreign key does not match the number of columns in the referenced table
sqlite> create table test (a,b, primary key(a), primary key(b));
Parse error: table "test" has more than one primary key
sqlite> create table test (a primary key, b primary key);
Parse error: table "test" has more than one primary key
sqlite> create table test (a primary key, b, primary key(a));
Parse error: table "test" has more than one primary key
HAVING
- HAVING clause on a non-aggregate query (
GroupBy::having): grammar already prevents this case (grammar differs from SQLite official grammar).
sqlite> SELECT 1 as i HAVING i > 1;
Parse error: HAVING clause on a non-aggregate query
vs
[ERROR sqlite3Parser] near HAVING, "Token(None)": syntax error
Err: near HAVING, "None": syntax error at (1, 21) in SELECT 1 as i HAVING i > 1
SELECT ...
- no duplicated column name in
selcollist/Select::columns
sqlite> SELECT 1 as i, 2 as i;
-- no error (idem for postgres)
SELECT ... ORDER BY ...
- ORDER BY term does not match any column in the result set (
Select::order_by)
sqlite> SELECT 1 as i ORDER BY j;
Parse error: no such column: j
SELECT 1 as i ORDER BY j;
^--- error here
WITH
- no duplicated column name in
CommonTableExpr::IndexedColumn
DML
sqlite> CREATE TABLE test (n, m);
sqlite> INSERT INTO test (n, n, m) VALUES (1, 0, 1); -- pgsql KO
sqlite> SELECT * FROM test;
1|1
sqlite> UPDATE test SET n = 1, n = 0; -- pgsql KO
sqlite> SELECT * FROM test;
0|1