Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | :-) (CVS 12) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
20f2811fc19f937ed03bdb0e9d87a40c |
User & Date: | drh 2000-05-30 03:12:21.000 |
Context
2000-05-30
| ||
03:28 | :-) (CVS 13) (check-in: 191a7f484e user: drh tags: trunk) | |
03:12 | :-) (CVS 12) (check-in: 20f2811fc1 user: drh tags: trunk) | |
00:51 | :-) (CVS 11) (check-in: 9818723ee1 user: drh tags: trunk) | |
Changes
Changes to src/build.c.
︙ | ︙ | |||
20 21 22 23 24 25 26 | ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** This file contains C code routines that are called by the parser ** when syntax rules are reduced. ** | | | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** This file contains C code routines that are called by the parser ** when syntax rules are reduced. ** ** $Id: build.c,v 1.5 2000/05/30 03:12:21 drh Exp $ */ #include "sqliteInt.h" /* ** This routine is called after a single SQL statement has been ** parsed and we want to execute the code to implement ** the statement. Prior action routines should have already |
︙ | ︙ | |||
203 204 205 206 207 208 209 | Table *pTable; char *zName; pParse->sFirstToken = *pStart; zName = sqliteTableNameFromToken(pName); pTable = sqliteFindTable(pParse->db, zName); if( pTable!=0 ){ | | | | | | 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | Table *pTable; char *zName; pParse->sFirstToken = *pStart; zName = sqliteTableNameFromToken(pName); pTable = sqliteFindTable(pParse->db, zName); if( pTable!=0 ){ sqliteSetNString(&pParse->zErrMsg, "table ", 0, pName->z, pName->n, " already exists", 0, 0); sqliteFree(zName); pParse->nErr++; return; } if( sqliteFindIndex(pParse->db, zName) ){ sqliteSetString(&pParse->zErrMsg, "there is already an index named ", zName, 0); sqliteFree(zName); pParse->nErr++; return; } pTable = sqliteMalloc( sizeof(Table) ); if( pTable==0 ){ sqliteSetString(&pParse->zErrMsg, "out of memory", 0); |
︙ | ︙ | |||
334 335 336 337 338 339 340 | int h; Vdbe *v; int base; pTable = sqliteTableFromToken(pParse, pName); if( pTable==0 ) return; if( pTable->readOnly ){ | | | | 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 | int h; Vdbe *v; int base; pTable = sqliteTableFromToken(pParse, pName); if( pTable==0 ) return; if( pTable->readOnly ){ sqliteSetString(&pParse->zErrMsg, "table ", pTable->zName, " may not be dropped", 0); pParse->nErr++; return; } /* Generate code to remove the table and its reference in sys_master */ v = pParse->pVdbe; if( v==0 ){ |
︙ | ︙ | |||
443 444 445 446 447 448 449 | if( pName ){ zName = sqliteTableNameFromToken(pName); }else{ zName = 0; sqliteSetString(&zName, pTab->zName, "__primary_key", 0); } if( sqliteFindIndex(pParse->db, zName) ){ | | | | | | 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 | if( pName ){ zName = sqliteTableNameFromToken(pName); }else{ zName = 0; sqliteSetString(&zName, pTab->zName, "__primary_key", 0); } if( sqliteFindIndex(pParse->db, zName) ){ sqliteSetString(&pParse->zErrMsg, "index ", zName, " already exists", 0); pParse->nErr++; goto exit_create_index; } if( sqliteFindTable(pParse->db, zName) ){ sqliteSetString(&pParse->zErrMsg, "there is already a table named ", zName, 0); pParse->nErr++; goto exit_create_index; } /* If pList==0, it means this routine was called to make a primary ** key out of the last field added to the table under construction. ** So create a fake list to simulate this. |
︙ | ︙ | |||
592 593 594 595 596 597 598 | char *zName; Vdbe *v; zName = sqliteTableNameFromToken(pName); pIndex = sqliteFindIndex(pParse->db, zName); sqliteFree(zName); if( pIndex==0 ){ | | | | 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 | char *zName; Vdbe *v; zName = sqliteTableNameFromToken(pName); pIndex = sqliteFindIndex(pParse->db, zName); sqliteFree(zName); if( pIndex==0 ){ sqliteSetNString(&pParse->zErrMsg, "no such index: ", 0, pName->z, pName->n, 0); pParse->nErr++; return; } /* Generate code to remove the index and from the master table */ v = pParse->pVdbe = sqliteVdbeCreate(pParse->db->pBe); if( v ){ |
︙ | ︙ | |||
749 750 751 752 753 754 755 | int i, j; Vdbe *v; zTab = sqliteTableNameFromToken(pTableName); pTab = sqliteFindTable(pParse->db, zTab); sqliteFree(zTab); if( pTab==0 ){ | | | | | | 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 | int i, j; Vdbe *v; zTab = sqliteTableNameFromToken(pTableName); pTab = sqliteFindTable(pParse->db, zTab); sqliteFree(zTab); if( pTab==0 ){ sqliteSetNString(&pParse->zErrMsg, "no such table: ", 0, pTableName->z, pTableName->n, 0); pParse->nErr++; goto insert_cleanup; } if( pTab->readOnly ){ sqliteSetString(&pParse->zErrMsg, "table ", pTab->zName, " may not be modified", 0); pParse->nErr++; goto insert_cleanup; } if( pField==0 && pList->nExpr!=pTab->nCol ){ char zNum1[30]; char zNum2[30]; sprintf(zNum1,"%d", pList->nExpr); |
︙ | ︙ | |||
889 890 891 892 893 894 895 | cnt++; pExpr->iTable = i; pExpr->iField = j; } } } if( cnt==0 ){ | | | | | | 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 | cnt++; pExpr->iTable = i; pExpr->iField = j; } } } if( cnt==0 ){ sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1, pExpr->token.z, pExpr->token.n, 0); pParse->nErr++; return 1; }else if( cnt>1 ){ sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1, pExpr->token.z, pExpr->token.n, 0); pParse->nErr++; return 1; } pExpr->op = TK_FIELD; break; } |
︙ | ︙ | |||
937 938 939 940 941 942 943 | cnt++; pExpr->iTable = i; pExpr->iField = j; } } } if( cnt==0 ){ | | | | | | 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 | cnt++; pExpr->iTable = i; pExpr->iField = j; } } } if( cnt==0 ){ sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1, pLeft->token.z, pLeft->token.n, ".", 1, z, n, 0); pParse->nErr++; return 1; }else if( cnt>1 ){ sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1, pExpr->token.z, pExpr->token.n, ".", 1, z, n, 0); pParse->nErr++; return 1; } sqliteExprDelete(pLeft); pExpr->pLeft = 0; sqliteExprDelete(pRight); pExpr->pRight = 0; |
︙ | ︙ | |||
1000 1001 1002 1003 1004 1005 1006 | if( pParse->nErr>0 ) goto select_cleanup; /* Look up every table in the table list. */ for(i=0; i<pTabList->nId; i++){ pTabList->a[i].pTab = sqliteFindTable(pParse->db, pTabList->a[i].zName); if( pTabList->a[i].pTab==0 ){ | | | | 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 | if( pParse->nErr>0 ) goto select_cleanup; /* Look up every table in the table list. */ for(i=0; i<pTabList->nId; i++){ pTabList->a[i].pTab = sqliteFindTable(pParse->db, pTabList->a[i].zName); if( pTabList->a[i].pTab==0 ){ sqliteSetString(&pParse->zErrMsg, "no such table: ", pTabList->a[i].zName, 0); pParse->nErr++; goto select_cleanup; } } /* If the list of fields to retrieve is "*" then replace it with ** a list of all fields from all tables. |
︙ | ︙ | |||
1175 1176 1177 1178 1179 1180 1181 | if( pTabList->a[i].pTab==0 ){ sqliteSetString(&pParse->zErrMsg, "no such table: ", pTabList->a[i].zName, 0); pParse->nErr++; goto delete_from_cleanup; } if( pTabList->a[i].pTab->readOnly ){ | | | | 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 | if( pTabList->a[i].pTab==0 ){ sqliteSetString(&pParse->zErrMsg, "no such table: ", pTabList->a[i].zName, 0); pParse->nErr++; goto delete_from_cleanup; } if( pTabList->a[i].pTab->readOnly ){ sqliteSetString(&pParse->zErrMsg, "table ", pTabList->a[i].zName, " may not be modified", 0); pParse->nErr++; goto delete_from_cleanup; } } pTab = pTabList->a[0].pTab; /* Resolve the field names in all the expressions. |
︙ | ︙ | |||
1273 1274 1275 1276 1277 1278 1279 | ** will be calling are designed to work with multiple tables and expect ** an IdList* parameter instead of just a Table* parameger. */ pTabList = sqliteIdListAppend(0, pTableName); for(i=0; i<pTabList->nId; i++){ pTabList->a[i].pTab = sqliteFindTable(pParse->db, pTabList->a[i].zName); if( pTabList->a[i].pTab==0 ){ | | | | | | 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 | ** will be calling are designed to work with multiple tables and expect ** an IdList* parameter instead of just a Table* parameger. */ pTabList = sqliteIdListAppend(0, pTableName); for(i=0; i<pTabList->nId; i++){ pTabList->a[i].pTab = sqliteFindTable(pParse->db, pTabList->a[i].zName); if( pTabList->a[i].pTab==0 ){ sqliteSetString(&pParse->zErrMsg, "no such table: ", pTabList->a[i].zName, 0); pParse->nErr++; goto update_cleanup; } if( pTabList->a[i].pTab->readOnly ){ sqliteSetString(&pParse->zErrMsg, "table ", pTabList->a[i].zName, " may not be modified", 0); pParse->nErr++; goto update_cleanup; } } pTab = pTabList->a[0].pTab; aXRef = sqliteMalloc( sizeof(int) * pTab->nCol ); if( aXRef==0 ) goto update_cleanup; |
︙ | ︙ | |||
1309 1310 1311 1312 1313 1314 1315 | if( strcmp(pTab->azCol[j], pChanges->a[i].zName)==0 ){ pChanges->a[i].idx = j; aXRef[j] = i; break; } } if( j>=pTab->nCol ){ | | | | 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 | if( strcmp(pTab->azCol[j], pChanges->a[i].zName)==0 ){ pChanges->a[i].idx = j; aXRef[j] = i; break; } } if( j>=pTab->nCol ){ sqliteSetString(&pParse->zErrMsg, "no such field: ", pChanges->a[i].zName, 0); pParse->nErr++; goto update_cleanup; } } /* Allocate memory for the array apIdx[] and fill it pointers to every ** index that needs to be updated. Indices only need updating if their |
︙ | ︙ |
Changes to test/delete.test.
︙ | ︙ | |||
19 20 21 22 23 24 25 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the DELETE FROM statement. # | | | | 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 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the DELETE FROM statement. # # $Id: delete.test,v 1.2 2000/05/30 03:12:22 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Try to delete from a non-existant table. # do_test delete-1.1 { set v [catch {execsql {DELETE FROM test1}} msg] lappend v $msg } {1 {no such table: test1}} # Try to delete from sqlite_master # do_test delete-2.1 { set v [catch {execsql {DELETE FROM sqlite_master}} msg] lappend v $msg } {1 {table sqlite_master may not be modified}} finish_test |
Changes to test/index.test.
︙ | ︙ | |||
19 20 21 22 23 24 25 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the CREATE INDEX statement. # | | | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the CREATE INDEX statement. # # $Id: index.test,v 1.2 2000/05/30 03:12:22 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Create a basic index and verify it is added to sqlite_master # do_test index-1.1 { |
︙ | ︙ | |||
163 164 165 166 167 168 169 | # do_test index-6.1 { execsql {CREATE TABLE test1(f1 int, f2 int)} execsql {CREATE TABLE test2(g1 real, g2 real)} execsql {CREATE INDEX index1 ON test1(f1)} set v [catch {execsql {CREATE INDEX index1 ON test2(g1)}} msg] lappend v $msg | | | | 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | # do_test index-6.1 { execsql {CREATE TABLE test1(f1 int, f2 int)} execsql {CREATE TABLE test2(g1 real, g2 real)} execsql {CREATE INDEX index1 ON test1(f1)} set v [catch {execsql {CREATE INDEX index1 ON test2(g1)}} msg] lappend v $msg } {1 {index index1 already exists}} do_test index-6.1b { execsql {SELECT name FROM sqlite_master ORDER BY name} } {index1 test1 test2} do_test index-6.2 { set v [catch {execsql {CREATE INDEX test1 ON test2(g1)}} msg] lappend v $msg } {1 {there is already a table named test1}} do_test index-6.2b { execsql {SELECT name FROM sqlite_master ORDER BY name} } {index1 test1 test2} do_test index-6.3 { execsql {DROP TABLE test1} execsql {DROP TABLE test2} execsql {SELECT name FROM sqlite_master ORDER BY name} |
︙ | ︙ | |||
206 207 208 209 210 211 212 | } {} # Make sure we cannot drop a non-existant table. # do_test index-8.1 { set v [catch {execsql {DROP INDEX index1}} msg] lappend v $msg | | | 206 207 208 209 210 211 212 213 214 215 216 217 | } {} # Make sure we cannot drop a non-existant table. # do_test index-8.1 { set v [catch {execsql {DROP INDEX index1}} msg] lappend v $msg } {1 {no such index: index1}} finish_test |
Changes to test/insert.test.
︙ | ︙ | |||
19 20 21 22 23 24 25 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the INSERT statement. # | | | | | 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 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the INSERT statement. # # $Id: insert.test,v 1.2 2000/05/30 03:12:22 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Try to insert into a non-existant table. # do_test insert-1.1 { set v [catch {execsql {INSERT INTO test1 VALUES(1,2,3)}} msg] lappend v $msg } {1 {no such table: test1}} # Try to insert into sqlite_master # do_test insert-1.2 { set v [catch {execsql {INSERT INTO sqlite_master VALUES(1,2,3,4)}} msg] lappend v $msg } {1 {table sqlite_master may not be modified}} # Try to insert the wrong number of entries. # do_test insert-1.3 { execsql {CREATE TABLE test1(one int, two int, three int)} set v [catch {execsql {INSERT INTO test1 VALUES(1,2)}} msg] lappend v $msg |
︙ | ︙ |
Changes to test/table.test.
︙ | ︙ | |||
19 20 21 22 23 24 25 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the CREATE TABLE statement. # | | | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the CREATE TABLE statement. # # $Id: table.test,v 1.2 2000/05/30 03:12:22 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Create a basic table and verify it is added to sqlite_master # do_test table-1.1 { |
︙ | ︙ | |||
92 93 94 95 96 97 98 | # Verify that we cannot make two tables with the same name # do_test table-2.1 { execsql {CREATE TABLE test2(one text)} set v [catch {execsql {CREATE TABLE test2(two text)}} msg] lappend v $msg | | | | | | | 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | # Verify that we cannot make two tables with the same name # do_test table-2.1 { execsql {CREATE TABLE test2(one text)} set v [catch {execsql {CREATE TABLE test2(two text)}} msg] lappend v $msg } {1 {table test2 already exists}} do_test table-2.1b { set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg] lappend v $msg } {1 {table sqlite_master already exists}} do_test table-2.1c { db close sqlite db testdb set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg] lappend v $msg } {1 {table sqlite_master already exists}} do_test table-2.1d { execsql {DROP TABLE test2; SELECT name FROM sqlite_master} } {} # Verify that we cannot make a table with the same name as an index # do_test table-2.2 { execsql {CREATE TABLE test2(one text); CREATE INDEX test3 ON test2(one)} set v [catch {execsql {CREATE TABLE test3(two text)}} msg] lappend v $msg } {1 {there is already an index named test3}} do_test table-2.2b { db close sqlite db testdb set v [catch {execsql {CREATE TABLE test3(two text)}} msg] lappend v $msg } {1 {there is already an index named test3}} do_test table-2.2c { execsql {DROP INDEX test3} set v [catch {execsql {CREATE TABLE test3(two text)}} msg] lappend v $msg } {0 {}} do_test table-2.2d { execsql {SELECT name FROM sqlite_master ORDER BY name} |
︙ | ︙ | |||
165 166 167 168 169 170 171 | do_test table-3.1 { execsql $big_table execsql {SELECT sql FROM sqlite_master} } \{$big_table\} do_test table-3.2 { set v [catch {execsql {CREATE TABLE BIG(xyz foo)}} msg] lappend v $msg | | | | | | 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | do_test table-3.1 { execsql $big_table execsql {SELECT sql FROM sqlite_master} } \{$big_table\} do_test table-3.2 { set v [catch {execsql {CREATE TABLE BIG(xyz foo)}} msg] lappend v $msg } {1 {table BIG already exists}} do_test table-3.3 { set v [catch {execsql {CREATE TABLE biG(xyz foo)}} msg] lappend v $msg } {1 {table biG already exists}} do_test table-3.4 { set v [catch {execsql {CREATE TABLE bIg(xyz foo)}} msg] lappend v $msg } {1 {table bIg already exists}} do_test table-3.5 { db close sqlite db testdb set v [catch {execsql {CREATE TABLE Big(xyz foo)}} msg] lappend v $msg } {1 {table Big already exists}} do_test table-3.6 { execsql {DROP TABLE big} execsql {SELECT name FROM sqlite_master} } {} # Try creating large numbers of tables # |
︙ | ︙ | |||
244 245 246 247 248 249 250 | } {1 {no such table: test9}} # Try to drop sqlite_master # do_test table-5.2 { set v [catch {execsql {DROP TABLE sqlite_master}} msg] lappend v $msg | | | 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 | } {1 {no such table: test9}} # Try to drop sqlite_master # do_test table-5.2 { set v [catch {execsql {DROP TABLE sqlite_master}} msg] lappend v $msg } {1 {table sqlite_master may not be dropped}} # Make sure an EXPLAIN does not really create a new table # do_test table-5.3 { execsql {EXPLAIN CREATE TABLE test1(f1 int)} execsql {SELECT name FROM sqlite_master} } {} |
︙ | ︙ |
Added test/update.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | # Copyright (c) 1999, 2000 D. Richard Hipp # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # # Author contact information: # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the UPDATE statement. # # $Id: update.test,v 1.1 2000/05/30 03:12:22 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Try to update an non-existent table # do_test update-1.1 { set v [catch {execsql {UPDATE test1 SET f2=5 WHERE f1<1}} msg] lappend v $msg } {1 {no such table: test1}} # Try to update a read-only table # do_test update-2.1 { set v [catch \ {execsql {UPDATE sqlite_master SET name='xyz' WHERE name='123'}} msg] lappend v $msg } {1 {table sqlite_master may not be modified}} # Create a table to work with # do_test update-3.1 { execsql {CREATE TABLE test1(f1 int,f2 int)} for {set i 1} {$i<=10} {incr i} { set sql "INSERT INTO test1 VALUES($i,[expr {int(pow(2,$i))}])" execsql $sql } execsql {SELECT * FROM test1 ORDER BY f1} } {1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024} # Unknown field name in an expression # do_test update-3.2 { set v [catch {execsql {UPDATE test1 SET f1=f3*2 WHERE f2==32}} msg] lappend v $msg } {1 {no such field: f3}} do_test update-3.3 { set v [catch {execsql {UPDATE test1 SET f1=test2.f1*2 WHERE f2==32}} msg] lappend v $msg } {1 {no such field: test2.f1}} do_test update-3.4 { set v [catch {execsql {UPDATE test1 SET f3=f1*2 WHERE f2==32}} msg] lappend v $msg } {1 {no such field: f3}} # Actually do some updates # do_test update-3.5 { execsql {UPDATE test1 SET f2=f2*3} execsql {SELECT * FROM test1 ORDER BY f1} } {1 6 2 12 3 24 4 48 5 96 6 192 7 384 8 768 9 1536 10 3072} do_test update-3.6 { execsql {UPDATE test1 SET f2=f2/3 WHERE f1<=5} execsql {SELECT * FROM test1 ORDER BY f1} } {1 2 2 4 3 8 4 16 5 32 6 192 7 384 8 768 9 1536 10 3072} do_test update-3.7 { execsql {UPDATE test1 SET f2=f2/3 WHERE f1>5} execsql {SELECT * FROM test1 ORDER BY f1} } {1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024} # Swap the values of f1 and f2 for all elements # do_test update-3.8 { execsql {UPDATE test1 SET f2=f1, f1=f2} execsql {SELECT * FROM test1 ORDER BY f1} } {2 1 4 2 8 3 16 4 32 5 64 6 128 7 256 8 512 9 1024 10} # Create an index and make sure updating works with an index. # do_test update-3.9 { execsql {CREATE INDEX index1 ON test1(f1)} execsql {CREATE INDEX index2 ON test1(f1)} execsql {UPDATE test1 SET f1=1025 WHERE f2==10} execsql {SELECT * FROM test1 ORDER BY f1} } {2 1 4 2 8 3 16 4 32 5 64 6 128 7 256 8 512 9 1025 10} do_test update-3.10 { execsql {SELECT * FROM test1 WHERE f1=1025} } {1025 10} do_test update-3.11 { execsql {UPDATE test1 SET f2=11 WHERE f1==1025} execsql {SELECT * FROM test1 ORDER BY f1} } {2 1 4 2 8 3 16 4 32 5 64 6 128 7 256 8 512 9 1025 11} do_test update-3.12 { execsql {SELECT * FROM test1 WHERE f1=1025} } {1025 11} finish_test |