xref: /sqlite-3.40.0/test/tableapi.test (revision 2a3c8ff8)
1b19a2bc6Sdrh# 2001 September 15
2d1bf3512Sdrh#
3b19a2bc6Sdrh# The author disclaims copyright to this source code.  In place of
4b19a2bc6Sdrh# a legal notice, here is a blessing:
5d1bf3512Sdrh#
6b19a2bc6Sdrh#    May you do good and not evil.
7b19a2bc6Sdrh#    May you find forgiveness for yourself and forgive others.
8b19a2bc6Sdrh#    May you share freely, never taking more than you give.
9d1bf3512Sdrh#
10d1bf3512Sdrh#***********************************************************************
11d1bf3512Sdrh# This file implements regression tests for SQLite library.  The
12d1bf3512Sdrh# focus of this file is testing the sqlite_exec_printf() and
13d1bf3512Sdrh# sqlite_get_table_printf() APIs.
14d1bf3512Sdrh#
15*2a3c8ff8Sdrh# $Id: tableapi.test,v 1.16 2008/03/17 15:09:48 drh Exp $
16d1bf3512Sdrh
17d1bf3512Sdrhset testdir [file dirname $argv0]
18d1bf3512Sdrhsource $testdir/tester.tcl
19d1bf3512Sdrh
20d1bf3512Sdrhdo_test tableapi-1.0 {
212dd59365Sdanielk1977  set ::dbx [sqlite3_open test.db]
22d1bf3512Sdrh  catch {sqlite_exec_printf $::dbx {DROP TABLE xyz} {}}
232dd59365Sdanielk1977  sqlite3_exec_printf $::dbx {CREATE TABLE %s(a int, b text)} xyz
24d1bf3512Sdrh} {0 {}}
25d1bf3512Sdrhdo_test tableapi-1.1 {
262dd59365Sdanielk1977  sqlite3_exec_printf $::dbx {
27d1bf3512Sdrh    INSERT INTO xyz VALUES(1,'%q')
28d1bf3512Sdrh  } {Hi Y'all}
29d1bf3512Sdrh} {0 {}}
30d1bf3512Sdrhdo_test tableapi-1.2 {
312dd59365Sdanielk1977  sqlite3_exec_printf $::dbx {SELECT * FROM xyz} {}
32d1bf3512Sdrh} {0 {a b 1 {Hi Y'all}}}
33d1bf3512Sdrh
34d1bf3512Sdrhdo_test tableapi-2.1 {
352dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
3601a34661Sdrh    BEGIN TRANSACTION;
37d1bf3512Sdrh    SELECT * FROM xyz WHERE b='%q'
38d1bf3512Sdrh  } {Hi Y'all}
39d1bf3512Sdrh} {0 1 2 a b 1 {Hi Y'all}}
40daffd0e5Sdrhdo_test tableapi-2.2 {
412dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
42daffd0e5Sdrh    SELECT * FROM xyz
43daffd0e5Sdrh  } {}
44daffd0e5Sdrh} {0 1 2 a b 1 {Hi Y'all}}
45daffd0e5Sdrhdo_test tableapi-2.3 {
46daffd0e5Sdrh  for {set i 2} {$i<=50} {incr i} {
472dd59365Sdanielk1977    sqlite3_get_table_printf $::dbx \
48daffd0e5Sdrh       "INSERT INTO xyz VALUES($i,'(%s)')" $i
49daffd0e5Sdrh  }
502dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
51daffd0e5Sdrh    SELECT * FROM xyz ORDER BY a
52daffd0e5Sdrh  } {}
53daffd0e5Sdrh} {0 50 2 a b 1 {Hi Y'all} 2 (2) 3 (3) 4 (4) 5 (5) 6 (6) 7 (7) 8 (8) 9 (9) 10 (10) 11 (11) 12 (12) 13 (13) 14 (14) 15 (15) 16 (16) 17 (17) 18 (18) 19 (19) 20 (20) 21 (21) 22 (22) 23 (23) 24 (24) 25 (25) 26 (26) 27 (27) 28 (28) 29 (29) 30 (30) 31 (31) 32 (32) 33 (33) 34 (34) 35 (35) 36 (36) 37 (37) 38 (38) 39 (39) 40 (40) 41 (41) 42 (42) 43 (43) 44 (44) 45 (45) 46 (46) 47 (47) 48 (48) 49 (49) 50 (50)}
54daffd0e5Sdrhdo_test tableapi-2.3.1 {
552dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
56daffd0e5Sdrh    SELECT * FROM xyz  WHERE a>49 ORDER BY a
57daffd0e5Sdrh  } {}
58daffd0e5Sdrh} {0 1 2 a b 50 (50)}
59daffd0e5Sdrhdo_test tableapi-2.3.2 {
602dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
61daffd0e5Sdrh    SELECT * FROM xyz WHERE a>47 ORDER BY a
62daffd0e5Sdrh  } {}
63daffd0e5Sdrh} {0 3 2 a b 48 (48) 49 (49) 50 (50)}
6401495b99Sdrhdo_test tableapi-2.3.3 {
6501495b99Sdrh  sqlite3_get_table_printf $::dbx {
6601495b99Sdrh    SELECT * FROM xyz WHERE a>47 ORDER BY a; invalid
6701495b99Sdrh  } {}
6801495b99Sdrh} {1 {near "invalid": syntax error}}
69d2b3e23bSdrhdo_test tableapi-2.3.4 {
70d2b3e23bSdrhbreakpoint
71d2b3e23bSdrh  sqlite3_get_table_printf $::dbx {
72d2b3e23bSdrh    SELECT * FROM xyz WHERE a>47 ORDER BY a
73d2b3e23bSdrh  } {} 8
74d2b3e23bSdrh} {0 a b 48 (48) 49 (49) 50 (50)}
75daffd0e5Sdrhdo_test tableapi-2.4 {
76e84a306bSdrh  set manyquote ''''''''
77e84a306bSdrh  append manyquote $manyquote
78e84a306bSdrh  append manyquote $manyquote
79e84a306bSdrh  append manyquote $manyquote
80e84a306bSdrh  append manyquote $manyquote
81e84a306bSdrh  append manyquote $manyquote
82e84a306bSdrh  append manyquote $manyquote
83e84a306bSdrh  set ::big_str "$manyquote Hello $manyquote"
842dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
85daffd0e5Sdrh    INSERT INTO xyz VALUES(51,'%q')
86daffd0e5Sdrh  } $::big_str
87daffd0e5Sdrh} {0 0 0}
88daffd0e5Sdrhdo_test tableapi-2.5 {
892dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
90daffd0e5Sdrh    SELECT * FROM xyz WHERE a>49 ORDER BY a;
91daffd0e5Sdrh  } {}
92daffd0e5Sdrh} "0 2 2 a b 50 (50) 51 \173$::big_str\175"
93daffd0e5Sdrhdo_test tableapi-2.6 {
942dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
95daffd0e5Sdrh    INSERT INTO xyz VALUES(52,NULL)
96daffd0e5Sdrh  } {}
973e8c37e7Sdanielk1977  ifcapable subquery {
982dd59365Sdanielk1977    sqlite3_get_table_printf $::dbx {
99daffd0e5Sdrh      SELECT * FROM xyz WHERE a IN (42,50,52) ORDER BY a DESC
100daffd0e5Sdrh    } {}
1013e8c37e7Sdanielk1977  } else {
1023e8c37e7Sdanielk1977    sqlite3_get_table_printf $::dbx {
1033e8c37e7Sdanielk1977      SELECT * FROM xyz WHERE a=42 OR a=50 OR a=52 ORDER BY a DESC
1043e8c37e7Sdanielk1977    } {}
1053e8c37e7Sdanielk1977  }
106daffd0e5Sdrh} {0 3 2 a b 52 NULL 50 (50) 42 (42)}
10701a34661Sdrhdo_test tableapi-2.7 {
1082dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
10901a34661Sdrh    SELECT * FROM xyz WHERE a>1000
11001a34661Sdrh  } {}
11101a34661Sdrh} {0 0 0}
11201a34661Sdrh
11301a34661Sdrh# Repeat all tests with the empty_result_callbacks pragma turned on
11401a34661Sdrh#
11501a34661Sdrhdo_test tableapi-3.1 {
1162dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
11701a34661Sdrh    ROLLBACK;
11801a34661Sdrh    PRAGMA empty_result_callbacks = ON;
11901a34661Sdrh    SELECT * FROM xyz WHERE b='%q'
12001a34661Sdrh  } {Hi Y'all}
12101a34661Sdrh} {0 1 2 a b 1 {Hi Y'all}}
12201a34661Sdrhdo_test tableapi-3.2 {
1232dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
12401a34661Sdrh    SELECT * FROM xyz
12501a34661Sdrh  } {}
12601a34661Sdrh} {0 1 2 a b 1 {Hi Y'all}}
12701a34661Sdrhdo_test tableapi-3.3 {
12801a34661Sdrh  for {set i 2} {$i<=50} {incr i} {
1292dd59365Sdanielk1977    sqlite3_get_table_printf $::dbx \
13001a34661Sdrh       "INSERT INTO xyz VALUES($i,'(%s)')" $i
13101a34661Sdrh  }
1322dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
13301a34661Sdrh    SELECT * FROM xyz ORDER BY a
13401a34661Sdrh  } {}
13501a34661Sdrh} {0 50 2 a b 1 {Hi Y'all} 2 (2) 3 (3) 4 (4) 5 (5) 6 (6) 7 (7) 8 (8) 9 (9) 10 (10) 11 (11) 12 (12) 13 (13) 14 (14) 15 (15) 16 (16) 17 (17) 18 (18) 19 (19) 20 (20) 21 (21) 22 (22) 23 (23) 24 (24) 25 (25) 26 (26) 27 (27) 28 (28) 29 (29) 30 (30) 31 (31) 32 (32) 33 (33) 34 (34) 35 (35) 36 (36) 37 (37) 38 (38) 39 (39) 40 (40) 41 (41) 42 (42) 43 (43) 44 (44) 45 (45) 46 (46) 47 (47) 48 (48) 49 (49) 50 (50)}
13601a34661Sdrhdo_test tableapi-3.3.1 {
1372dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
13801a34661Sdrh    SELECT * FROM xyz  WHERE a>49 ORDER BY a
13901a34661Sdrh  } {}
14001a34661Sdrh} {0 1 2 a b 50 (50)}
14101a34661Sdrhdo_test tableapi-3.3.2 {
1422dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
14301a34661Sdrh    SELECT * FROM xyz WHERE a>47 ORDER BY a
14401a34661Sdrh  } {}
14501a34661Sdrh} {0 3 2 a b 48 (48) 49 (49) 50 (50)}
14601a34661Sdrhdo_test tableapi-3.4 {
1472dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
14801a34661Sdrh    INSERT INTO xyz VALUES(51,'%q')
14901a34661Sdrh  } $::big_str
15001a34661Sdrh} {0 0 0}
15101a34661Sdrhdo_test tableapi-3.5 {
1522dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
15301a34661Sdrh    SELECT * FROM xyz WHERE a>49 ORDER BY a;
15401a34661Sdrh  } {}
15501a34661Sdrh} "0 2 2 a b 50 (50) 51 \173$::big_str\175"
15601a34661Sdrhdo_test tableapi-3.6 {
1572dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
15801a34661Sdrh    INSERT INTO xyz VALUES(52,NULL)
15901a34661Sdrh  } {}
1603e8c37e7Sdanielk1977  ifcapable subquery {
1612dd59365Sdanielk1977    sqlite3_get_table_printf $::dbx {
16201a34661Sdrh      SELECT * FROM xyz WHERE a IN (42,50,52) ORDER BY a DESC
16301a34661Sdrh    } {}
1643e8c37e7Sdanielk1977  } else {
1653e8c37e7Sdanielk1977    sqlite3_get_table_printf $::dbx {
1663e8c37e7Sdanielk1977      SELECT * FROM xyz WHERE a=42 OR a=50 OR a=52 ORDER BY a DESC
1673e8c37e7Sdanielk1977    } {}
1683e8c37e7Sdanielk1977  }
16901a34661Sdrh} {0 3 2 a b 52 NULL 50 (50) 42 (42)}
17001a34661Sdrhdo_test tableapi-3.7 {
1712dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {
17201a34661Sdrh    SELECT * FROM xyz WHERE a>1000
17301a34661Sdrh  } {}
17401a34661Sdrh} {0 0 2 a b}
175d1bf3512Sdrh
176f1a7a139Sdrhdo_test tableapi-4.1 {
177f1a7a139Sdrh  set rc [catch {
1782dd59365Sdanielk1977    sqlite3_get_table_printf $::dbx {
179f1a7a139Sdrh      SELECT * FROM xyz;  SELECT * FROM sqlite_master
180f1a7a139Sdrh    } {}
181f1a7a139Sdrh  } msg]
182f1a7a139Sdrh  concat $rc $msg
1832dd59365Sdanielk1977} {0 1 {sqlite3_get_table() called with two or more incompatible queries}}
184f1a7a139Sdrh
1859faae941Sdrh# A report on the mailing list says that the sqlite_get_table() api fails
1869faae941Sdrh# on queries involving more than 40 columns.  The following code attempts
1879faae941Sdrh# to test that complaint
1889faae941Sdrh#
1899faae941Sdrhdo_test tableapi-5.1 {
1909faae941Sdrh  set sql "CREATE TABLE t2("
1919faae941Sdrh  set sep ""
1929faae941Sdrh  for {set i 1} {$i<=100} {incr i} {
1939faae941Sdrh    append sql ${sep}x$i
1949faae941Sdrh    set sep ,
1959faae941Sdrh  }
1969faae941Sdrh  append sql )
1972dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx $sql {}
1989faae941Sdrh  set sql "INSERT INTO t2 VALUES("
1999faae941Sdrh  set sep ""
2009faae941Sdrh  for {set i 1} {$i<=100} {incr i} {
2019faae941Sdrh    append sql ${sep}$i
2029faae941Sdrh    set sep ,
2039faae941Sdrh  }
2049faae941Sdrh  append sql )
2052dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx $sql {}
2062dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {SELECT * FROM t2} {}
2079faae941Sdrh} {0 1 100 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 x100 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100}
2089faae941Sdrhdo_test tableapi-5.2 {
2099faae941Sdrh  set sql "INSERT INTO t2 VALUES("
2109faae941Sdrh  set sep ""
2119faae941Sdrh  for {set i 1} {$i<=100} {incr i} {
2129faae941Sdrh    append sql ${sep}[expr {$i+1000}]
2139faae941Sdrh    set sep ,
2149faae941Sdrh  }
2159faae941Sdrh  append sql )
2162dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx $sql {}
2172dd59365Sdanielk1977  sqlite3_get_table_printf $::dbx {SELECT * FROM t2} {}
2189faae941Sdrh} {0 2 100 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60 x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73 x74 x75 x76 x77 x78 x79 x80 x81 x82 x83 x84 x85 x86 x87 x88 x89 x90 x91 x92 x93 x94 x95 x96 x97 x98 x99 x100 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100}
2199faae941Sdrh
2204152e677Sdanielk1977ifcapable schema_pragmas {
2212cc55698Sdrh  do_test tableapi-6.1 {
2222cc55698Sdrh    sqlite3_get_table_printf $::dbx {PRAGMA user_version} {}
22392895268Sdrh  } {0 1 1 user_version 0}
2244152e677Sdanielk1977}
2252cc55698Sdrh
22601495b99Sdrhifcapable memdebug {
22701495b99Sdrh  source $testdir/malloc_common.tcl
22801495b99Sdrh  do_malloc_test tableapi-7 -sqlprep {
229*2a3c8ff8Sdrh    DROP TABLE IF EXISTS t1;
23001495b99Sdrh    CREATE TABLE t1(a,b);
23101495b99Sdrh    INSERT INTO t1 VALUES(1,2);
23201495b99Sdrh    INSERT INTO t1 VALUES(3,4);
23301495b99Sdrh    INSERT INTO t1 SELECT a+4, b+4 FROM t1;
23401495b99Sdrh    INSERT INTO t1 SELECT a+8, b+8 FROM t1;
23501495b99Sdrh  } -tclbody {
23601495b99Sdrh    set r [sqlite3_get_table_printf db {SELECT rowid, a, b FROM t1} {}]
23701495b99Sdrh    if {[llength $r]<26} {error "out of memory"}
23801495b99Sdrh  }
23901495b99Sdrh}
24001495b99Sdrh
241d1bf3512Sdrhdo_test tableapi-99.0 {
2422dd59365Sdanielk1977  sqlite3_close $::dbx
24396d81f99Sdanielk1977} {SQLITE_OK}
244d1bf3512Sdrh
245d1bf3512Sdrhfinish_test
246