From 200a81dcb51bb5c02625a4fe6b6dabbf630a069c Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Aug 2008 14:19:41 +0000 Subject: [PATCH] Disallow the ON CONFLICT clause on CHECK constraints. The syntax used to be allowed but never worked, so this should not present compatibility problems. Other internal grammar simplifications. (CVS 5546) FossilOrigin-Name: 4cedc641ed39982ae8cbb9200aa1e2f37c878b73 --- addopcodes.awk | 11 +++++------ manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/alter.c | 4 ++-- src/parse.y | 12 +++++------- src/tokenize.c | 9 ++++----- 6 files changed, 26 insertions(+), 30 deletions(-) diff --git a/addopcodes.awk b/addopcodes.awk index b806b1d96c..f6f8927e24 100644 --- a/addopcodes.awk +++ b/addopcodes.awk @@ -23,10 +23,9 @@ END { printf "#define TK_%-29s %4d\n", "ILLEGAL", max+7 printf "#define TK_%-29s %4d\n", "SPACE", max+8 printf "#define TK_%-29s %4d\n", "UNCLOSED_STRING", max+9 - printf "#define TK_%-29s %4d\n", "COMMENT", max+10 - printf "#define TK_%-29s %4d\n", "FUNCTION", max+11 - printf "#define TK_%-29s %4d\n", "COLUMN", max+12 - printf "#define TK_%-29s %4d\n", "AGG_FUNCTION", max+13 - printf "#define TK_%-29s %4d\n", "AGG_COLUMN", max+14 - printf "#define TK_%-29s %4d\n", "CONST_FUNC", max+15 + printf "#define TK_%-29s %4d\n", "FUNCTION", max+10 + printf "#define TK_%-29s %4d\n", "COLUMN", max+11 + printf "#define TK_%-29s %4d\n", "AGG_FUNCTION", max+12 + printf "#define TK_%-29s %4d\n", "AGG_COLUMN", max+13 + printf "#define TK_%-29s %4d\n", "CONST_FUNC", max+14 } diff --git a/manifest b/manifest index d3372aa7be..7796057869 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C Improved\sclarity\sof\spresentation\sin\sthe\stokenizer.\s(CVS\s5545) -D 2008-08-07T13:05:35 +C Disallow\sthe\sON\sCONFLICT\sclause\son\sCHECK\sconstraints.\s\sThe\ssyntax\sused\sto\sbe\nallowed\sbut\snever\sworked,\sso\sthis\sshould\snot\spresent\scompatibility\sproblems.\nOther\sinternal\sgrammar\ssimplifications.\s(CVS\s5546) +D 2008-08-08T14:19:41 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 2713ea64947be3b35f35d9a3158bb8299c90b019 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F README b974cdc3f9f12b87e851b04e75996d720ebf81ac F VERSION 1d5b2c9192236ed2c6bad659a7c2d1662e39e7b9 F aclocal.m4 7d02b11fed45174e11156144227278deb6236eea -F addopcodes.awk 701697fae48376375ec8532c3d04e910cfeef352 +F addopcodes.awk 48a2ffae0a6fb191ae9e42e69a90b15d973e0339 F art/2005osaward.gif 0d1851b2a7c1c9d0ccce545f3e14bca42d7fd248 F art/SQLite.eps 9b43cc99cfd2be687d386faea6862ea68d6a72b2 F art/SQLite.gif 1bbb94484963f1382e27e1c5e86dd0c1061eba2b @@ -90,7 +90,7 @@ F sqlite.pc.in c322c6244c6395955dca34d87955aabde7df7623 F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc F sqlite3.def a1be7b9a4b8b51ac41c6ff6e8e44a14ef66b338b F sqlite3.pc.in 32b8a014799c2028c8e0c9cc5659718262fc493f -F src/alter.c 2c541aaa88d720301253f181799d4af7bb9ddf1c +F src/alter.c f462b637bac6c6576a9b7bc6da59c7a82ed5aab2 F src/analyze.c 747ce8cb6b318bb0d0576cfb5277aed98cbbeb5c F src/attach.c a85c14612e7e3410e0c3d2e0241832fa9688bd14 F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627 @@ -137,7 +137,7 @@ F src/os_unix.c fe0dbc35bcd3de49e46b132abfc0f45d6dd6a864 F src/os_win.c aefe9ee26430678a19a058a874e4e2bd91398142 F src/pager.c b6a366f2343e7f127d7e70dbe76cd664336143cd F src/pager.h 588c1ac195228b2da45c4e5f7ab6c2fd253d1751 -F src/parse.y d962e544d9953289db23c1d4cc2dab514c7136fa +F src/parse.y 3bd91b936a247dbb89a6fb1824cb18c6987f16b0 F src/pragma.c 6e207b4f69901089758c02c02e0bf86ed12a4d8f F src/prepare.c d9f420808f7d2802258f0bf64103271311e2d87f F src/printf.c 2e984b2507291a7e16d89dc9bb60582904f6247d @@ -177,7 +177,7 @@ F src/test_schema.c 4b4bf7bb329326458c491b0e6facd4c8c4c5b479 F src/test_server.c f0a403b5f699c09bd2b1236b6f69830fd6221f6b F src/test_tclvar.c 73530070df8378571c8ce6bbbbb993236ae3ad0b F src/test_thread.c e297dd41db0b249646e69f97d36ec13e56e8b730 -F src/tokenize.c 0b8f3e1dc928cef15857fd59a61e76afcf7a39b4 +F src/tokenize.c d16ca0e9944161c76d2e4c11dc379ec88189b93b F src/trigger.c b61aaf7bff8e3763b234dbf46a1a64fb88a34e64 F src/update.c 79b77a3cc8ed5f8903a7f37055fcedd69388dcae F src/utf.c a7004436a6ef2aee012ace93de274dd0f3c7624e @@ -617,7 +617,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P ce8cbeea51442ea963bcdf5ddc71f021fb996a37 -R d3ffb4267b8bb3f4ad51b066b9b3e92c +P 732657c6a639bdf71a3341f6747d19298d442ddb +R a8dbe9c0297be9af2808d9fc7cbb821d U drh -Z 7539001bbb09229cb83d06a8b023aae5 +Z c51d96114f2cd9514587cda1bec559ff diff --git a/manifest.uuid b/manifest.uuid index d6c704253a..ab8e704957 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -732657c6a639bdf71a3341f6747d19298d442ddb \ No newline at end of file +4cedc641ed39982ae8cbb9200aa1e2f37c878b73 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index ba929beddc..ec315da487 100644 --- a/src/alter.c +++ b/src/alter.c @@ -12,7 +12,7 @@ ** This file contains C code routines that used to generate VDBE code ** that implements the ALTER TABLE command. ** -** $Id: alter.c,v 1.47 2008/07/28 19:34:53 drh Exp $ +** $Id: alter.c,v 1.48 2008/08/08 14:19:41 drh Exp $ */ #include "sqliteInt.h" #include @@ -74,7 +74,7 @@ static void renameTableFunc( do { zCsr += len; len = sqlite3GetToken(zCsr, &token); - } while( token==TK_SPACE || token==TK_COMMENT ); + } while( token==TK_SPACE ); assert( len>0 ); } while( token!=TK_LP && token!=TK_USING ); diff --git a/src/parse.y b/src/parse.y index b2cbe9bcab..8b6d1632e8 100644 --- a/src/parse.y +++ b/src/parse.y @@ -14,7 +14,7 @@ ** the parser. Lemon will also generate a header file containing ** numeric codes for all of the tokens. ** -** @(#) $Id: parse.y,v 1.248 2008/07/31 01:40:42 shane Exp $ +** @(#) $Id: parse.y,v 1.249 2008/08/08 14:19:41 drh Exp $ */ // All token codes are small integers with #defines that begin with "TK_" @@ -91,7 +91,6 @@ struct AttachKey { int type; Token key; }; input ::= cmdlist. cmdlist ::= cmdlist ecmd. cmdlist ::= ecmd. -cmdx ::= cmd. { sqlite3FinishCoding(pParse); } ecmd ::= SEMI. ecmd ::= explain cmdx SEMI. explain ::= . { sqlite3BeginParse(pParse, 0); } @@ -99,6 +98,7 @@ explain ::= . { sqlite3BeginParse(pParse, 0); } explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } %endif SQLITE_OMIT_EXPLAIN +cmdx ::= cmd. { sqlite3FinishCoding(pParse); } ///////////////////// Begin and end transactions. //////////////////////////// // @@ -313,7 +313,7 @@ tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). {sqlite3AddPrimaryKey(pParse,X,R,I,0);} tcons ::= UNIQUE LP idxlist(X) RP onconf(R). {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} -tcons ::= CHECK LP expr(E) RP onconf. {sqlite3AddCheckConstraint(pParse,E);} +tcons ::= CHECK LP expr(E) RP. {sqlite3AddCheckConstraint(pParse,E);} tcons ::= FOREIGN KEY LP idxlist(FA) RP REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { sqlite3CreateForeignKey(pParse, FA, &T, TA, R); @@ -885,11 +885,10 @@ uniqueflag(A) ::= . {A = OE_None;} %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} %type idxlist_opt {ExprList*} %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} -%type idxitem {Token} idxlist_opt(A) ::= . {A = 0;} idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} -idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder(Z). { +idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { Expr *p = 0; if( C.n>0 ){ p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); @@ -899,7 +898,7 @@ idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder(Z). { sqlite3ExprListCheckLength(pParse, A, "index"); if( A ) A->a[A->nExpr-1].sortOrder = Z; } -idxlist(A) ::= idxitem(Y) collate(C) sortorder(Z). { +idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { Expr *p = 0; if( C.n>0 ){ p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); @@ -909,7 +908,6 @@ idxlist(A) ::= idxitem(Y) collate(C) sortorder(Z). { sqlite3ExprListCheckLength(pParse, A, "index"); if( A ) A->a[A->nExpr-1].sortOrder = Z; } -idxitem(A) ::= nm(X). {A = X;} %type collate {Token} collate(C) ::= . {C.z = 0; C.n = 0;} diff --git a/src/tokenize.c b/src/tokenize.c index eaca6b53b7..3e5bd9de94 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -15,7 +15,7 @@ ** individual tokens and sends those tokens one-by-one over to the ** parser for analysis. ** -** $Id: tokenize.c,v 1.149 2008/08/07 13:05:36 drh Exp $ +** $Id: tokenize.c,v 1.150 2008/08/08 14:19:41 drh Exp $ */ #include "sqliteInt.h" #include @@ -131,7 +131,7 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){ case '-': { if( z[1]=='-' ){ for(i=2; (c=z[i])!=0 && c!='\n'; i++){} - *tokenType = TK_COMMENT; + *tokenType = TK_SPACE; return i; } *tokenType = TK_MINUS; @@ -164,7 +164,7 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){ } for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){} if( c ) i++; - *tokenType = TK_COMMENT; + *tokenType = TK_SPACE; return i; } case '%': { @@ -420,8 +420,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ break; } switch( tokenType ){ - case TK_SPACE: - case TK_COMMENT: { + case TK_SPACE: { if( db->u1.isInterrupted ){ pParse->rc = SQLITE_INTERRUPT; sqlite3SetString(pzErrMsg, db, "interrupt");