blob: 212885c05c7b3efbe8cfde8e89daeeda198832dd [file] [log] [blame]
drhb19a2bc2001-09-16 00:13:26 +00001# 2001 September 15
drh87c40e82001-07-23 14:33:02 +00002#
drhb19a2bc2001-09-16 00:13:26 +00003# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
drh87c40e82001-07-23 14:33:02 +00005#
drhb19a2bc2001-09-16 00:13:26 +00006# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
drh87c40e82001-07-23 14:33:02 +00009#
10#***********************************************************************
11# This file implements regression tests for SQLite library. The
12# focus of this file is the ability to specify table and column names
13# as quoted strings.
14#
drhb556ce12007-04-25 11:32:30 +000015# $Id: quote.test,v 1.7 2007/04/25 11:32:30 drh Exp $
drh87c40e82001-07-23 14:33:02 +000016
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
dan0d925712019-05-20 17:14:25 +000019set testprefix quote
drh87c40e82001-07-23 14:33:02 +000020
21# Create a table with a strange name and with strange column names.
22#
23do_test quote-1.0 {
drh3d946622005-08-13 18:15:42 +000024 catchsql {CREATE TABLE '@abc' ( '#xyz' int, '!pqr' text );}
drh87c40e82001-07-23 14:33:02 +000025} {0 {}}
26
27# Insert, update and query the table.
28#
29do_test quote-1.1 {
drh3d946622005-08-13 18:15:42 +000030 catchsql {INSERT INTO '@abc' VALUES(5,'hello')}
drh87c40e82001-07-23 14:33:02 +000031} {0 {}}
drh3d946622005-08-13 18:15:42 +000032do_test quote-1.2.1 {
33 catchsql {SELECT * FROM '@abc'}
34} {0 {5 hello}}
35do_test quote-1.2.2 {
36 catchsql {SELECT * FROM [@abc]} ;# SqlServer compatibility
37} {0 {5 hello}}
38do_test quote-1.2.3 {
39 catchsql {SELECT * FROM `@abc`} ;# MySQL compatibility
drh87c40e82001-07-23 14:33:02 +000040} {0 {5 hello}}
41do_test quote-1.3 {
drh3d946622005-08-13 18:15:42 +000042 catchsql {
43 SELECT '@abc'.'!pqr', '@abc'.'#xyz'+5 FROM '@abc'
44 }
drh87c40e82001-07-23 14:33:02 +000045} {0 {hello 10}}
drh23989372002-05-21 13:43:04 +000046do_test quote-1.3.1 {
47 catchsql {
48 SELECT '!pqr', '#xyz'+5 FROM '@abc'
49 }
drh8df447f2005-11-01 15:48:24 +000050} {0 {!pqr 5}}
drh23989372002-05-21 13:43:04 +000051do_test quote-1.3.2 {
52 catchsql {
53 SELECT "!pqr", "#xyz"+5 FROM '@abc'
54 }
55} {0 {hello 10}}
drh3d946622005-08-13 18:15:42 +000056do_test quote-1.3.3 {
57 catchsql {
58 SELECT [!pqr], `#xyz`+5 FROM '@abc'
59 }
60} {0 {hello 10}}
drhb556ce12007-04-25 11:32:30 +000061do_test quote-1.3.4 {
drh23989372002-05-21 13:43:04 +000062 set r [catch {
63 execsql {SELECT '@abc'.'!pqr', '@abc'.'#xyz'+5 FROM '@abc'}
64 } msg ]
65 lappend r $msg
66} {0 {hello 10}}
drh87c40e82001-07-23 14:33:02 +000067do_test quote-1.4 {
68 set r [catch {
69 execsql {UPDATE '@abc' SET '#xyz'=11}
70 } msg ]
71 lappend r $msg
72} {0 {}}
73do_test quote-1.5 {
74 set r [catch {
75 execsql {SELECT '@abc'.'!pqr', '@abc'.'#xyz'+5 FROM '@abc'}
76 } msg ]
77 lappend r $msg
78} {0 {hello 16}}
79
80# Drop the table with the strange name.
81#
82do_test quote-1.6 {
83 set r [catch {
84 execsql {DROP TABLE '@abc'}
85 } msg ]
86 lappend r $msg
87} {0 {}}
dan0d925712019-05-20 17:14:25 +000088
89#-------------------------------------------------------------------------
90# Check that it is not possible to use double-quotes for a string
91# constant in a CHECK constraint or CREATE INDEX statement. However,
92# SQLite can load such a schema from disk.
93#
94reset_db
drh4b50da92019-07-02 12:23:09 +000095sqlite3_db_config db SQLITE_DBCONFIG_DQS_DDL 0
96sqlite3_db_config db SQLITE_DBCONFIG_DQS_DML 1
dan0d925712019-05-20 17:14:25 +000097do_execsql_test 2.0 {
98 CREATE TABLE t1(x, y, z);
99}
100foreach {tn sql errname} {
101 1 { CREATE TABLE xyz(a, b, c CHECK (c!="null") ) } null
102 2 { CREATE INDEX i2 ON t1(x, y, z||"abc") } abc
103 3 { CREATE INDEX i3 ON t1("w") } w
104 4 { CREATE INDEX i4 ON t1(x) WHERE z="w" } w
105} {
106 do_catchsql_test 2.1.$tn $sql [list 1 "no such column: $errname"]
107}
108
109do_execsql_test 2.2 {
110 PRAGMA writable_schema = 1;
111 CREATE TABLE xyz(a, b, c CHECK (c!="null") );
112 CREATE INDEX i2 ON t1(x, y, z||"abc");
drh44d44132021-03-14 19:55:40 +0000113 CREATE INDEX i3 ON t1("w"||"");
dan0d925712019-05-20 17:14:25 +0000114 CREATE INDEX i4 ON t1(x) WHERE z="w";
115}
116
117db close
118sqlite3 db test.db
119
120do_execsql_test 2.3.1 {
121 INSERT INTO xyz VALUES(1, 2, 3);
122}
123do_catchsql_test 2.3.2 {
124 INSERT INTO xyz VALUES(1, 2, 'null');
drh92e21ef2020-08-27 18:36:30 +0000125} {1 {CHECK constraint failed: c!="null"}}
dan0d925712019-05-20 17:14:25 +0000126
127do_execsql_test 2.4 {
128 INSERT INTO t1 VALUES(1, 2, 3);
129 INSERT INTO t1 VALUES(4, 5, 'w');
130 SELECT * FROM t1 WHERE z='w';
131} {4 5 w}
132do_execsql_test 2.5 {
133 SELECT sql FROM sqlite_master;
134} {
135 {CREATE TABLE t1(x, y, z)}
136 {CREATE TABLE xyz(a, b, c CHECK (c!="null") )}
137 {CREATE INDEX i2 ON t1(x, y, z||"abc")}
drh44d44132021-03-14 19:55:40 +0000138 {CREATE INDEX i3 ON t1("w"||"")}
dan0d925712019-05-20 17:14:25 +0000139 {CREATE INDEX i4 ON t1(x) WHERE z="w"}
140}
141
drh44d44132021-03-14 19:55:40 +0000142# 2021-03-13
143# ticket 1c24a659e6d7f3a1
144reset_db
145do_catchsql_test 3.0 {
146 CREATE TABLE t1(a,b);
147 CREATE INDEX x1 on t1("b");
148 ALTER TABLE t1 DROP COLUMN b;
149} {1 {error in index x1 after drop column: no such column: b}}
150do_catchsql_test 3.1 {
151 DROP TABLE t1;
152 CREATE TABLE t1(a,"b");
153 CREATE INDEX x1 on t1("b");
154 ALTER TABLE t1 DROP COLUMN b;
155} {1 {error in index x1 after drop column: no such column: b}}
156do_catchsql_test 3.2 {
157 DROP TABLE t1;
158 CREATE TABLE t1(a,'b');
159 CREATE INDEX x1 on t1("b");
160 ALTER TABLE t1 DROP COLUMN b;
161} {1 {error in index x1 after drop column: no such column: b}}
162do_catchsql_test 3.3 {
163 DROP TABLE t1;
164 CREATE TABLE t1(a,"b");
165 CREATE INDEX x1 on t1('b');
166 ALTER TABLE t1 DROP COLUMN b;
167} {1 {error in index x1 after drop column: no such column: b}}
168do_catchsql_test 3.4 {
169 DROP TABLE t1;
170 CREATE TABLE t1(a, b, c);
171 CREATE INDEX x1 ON t1("a"||"b");
172 INSERT INTO t1 VALUES(1,2,3),(1,4,5);
173 ALTER TABLE t1 DROP COLUMN b;
174} {1 {error in index x1 after drop column: no such column: b}}
drh0e8075a2021-03-14 20:17:06 +0000175do_catchsql_test 3.5 {
176 DROP TABLE t1;
177 CREATE TABLE t1(a, b, c);
178 CREATE INDEX x1 ON t1("a"||"x");
179 INSERT INTO t1 VALUES(1,2,3),(1,4,5);
180 ALTER TABLE t1 DROP COLUMN b;
181} {0 {}}
drh87c40e82001-07-23 14:33:02 +0000182
183finish_test