]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add support for DROP TABLE IF EXISTS. (CVS 2843)
authordrh <drh@noemail.net>
Thu, 29 Dec 2005 01:11:36 +0000 (01:11 +0000)
committerdrh <drh@noemail.net>
Thu, 29 Dec 2005 01:11:36 +0000 (01:11 +0000)
FossilOrigin-Name: a4c547de83d8b27f06a58f9e530a7c983ec1dc3a

manifest
manifest.uuid
src/build.c
src/parse.y
src/sqliteInt.h
src/util.c
test/table.test
tool/mkkeywordhash.c
www/lang.tcl

index d51c4c2858aad913ed030cc1d8b360e1d0f418a3..ffe9f0e94828e6bbeeba15a44329fbbb8cb5aa77 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\sgenericAllocationSize\swork\son\sNULL\spointers.\s(CVS\s2842)
-D 2005-12-22T13:47:50
+C Add\ssupport\sfor\sDROP\sTABLE\sIF\sEXISTS.\s(CVS\s2843)
+D 2005-12-29T01:11:37
 F Makefile.in e3c6b3a38d734d41574c04f2fc90d18de2b87102
 F Makefile.linux-gcc aee18d8a05546dcf1888bd4547e442008a49a092
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -36,7 +36,7 @@ F src/attach.c ee70131f128d31a9c6dcb8824e8471c91b18601a
 F src/auth.c 31e2304bef67f44d635655f44234387ea7d21454
 F src/btree.c 2b2651e0f6f9f8c5976b662fbfab7fc8f54f02c9
 F src/btree.h 8ff86378bb5af0cde282614c16bf0c0190b6d216
-F src/build.c 51f3f46801f68f49be8a1887f6a88e7fa3a16956
+F src/build.c 88a441416fb28139fa24fd0fa34288c618c2b3fc
 F src/callback.c 62066afd516f220575e81b1a1239ab92a2eae252
 F src/complete.c df1681cef40dec33a286006981845f87b194e7a4
 F src/date.c bb079317bff6a2b78aba5c0d2ddae5f6f03acfb7
@@ -61,7 +61,7 @@ F src/os_win.c 9feb97f49b93d451f8ef7c5dd388e05a44647dc6
 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
 F src/pager.c 5227ea29acbea4b6a9c6f1dfd3e8493de5fc2a93
 F src/pager.h e0acb095b3ad0bca48f2ab00c87346665643f64f
-F src/parse.y 142a4b347c82217332e2d3dfa317ff2b7ac32f9c
+F src/parse.y 13343510907419ecd2fe72a245f9880df9a7dc20
 F src/pragma.c 8883b4d34796efa315bdd0ec1b03f580ef1575b9
 F src/prepare.c 1417a396efe55e2767f9f97f694d21b8cac2f4d6
 F src/printf.c f47a2f4b5387cd2ebb12e9117a1a5d6bd9a2b812
@@ -69,7 +69,7 @@ F src/random.c ff5e9a8cad790e2a51cd4d2e7737dc8540e09d1d
 F src/select.c 2292b065bc6be61e01aad39a2e1b93e332fb7e57
 F src/shell.c 4872acee1d2a826c73c914961e469e563204b7f9
 F src/sqlite.h.in 015e02efa9e8bafa31b6c270116369ddff4e9803
-F src/sqliteInt.h b8b2b2da145c15c8577316f0b8899ba65c098ccc
+F src/sqliteInt.h 361a613a1b7b1bdf1f040f11fd82e2c3a80a4259
 F src/table.c 486dcfce532685b53b5a2b5da8bba0ded6fb2316
 F src/tclsqlite.c ce481c0a21a20641cdfe87c9cbbb328cfb3a58b9
 F src/test1.c 4691cc7235683324791a0be560308ca338de36de
@@ -82,7 +82,7 @@ F src/tokenize.c 7a3a3d3cc734f684a77c4dfd09eb46fcee25394c
 F src/trigger.c 2925ba96d964d9b717e74006bf7e64b8a6b70d97
 F src/update.c ec8e540617b116725b5a55c8d6b4db8bc67fdd7d
 F src/utf.c b7bffac4260177ae7f83c01d025fe0f5ed70ce71
-F src/util.c 8e0e3b1ad4f7c70706a9e76881882a409ccdb2e8
+F src/util.c a690bbf549fc5c465384f624e90c009935b6d18b
 F src/vacuum.c fbfdd3967fd34e2f260fafed88dcbf3c10856b94
 F src/vdbe.c c04d2e517e7b515993164f51a3a8fb0958b7f4ce
 F src/vdbe.h 8729a4ee16ff9aeab2af9667df3cf300ff978e13
@@ -222,7 +222,7 @@ F test/sort.test 0e4456e729e5a92a625907c63dcdedfbe72c5dc5
 F test/subquery.test e6de53332c0301b3cfa34edc3f3cd5fa1e859efd
 F test/subselect.test 2d13fb7f450db3595adcdd24079a0dd1d2d6abc2
 F test/sync.test 6e8b885cec5ccba2090e92c90f747a7142f53c88
-F test/table.test ec0e6c2186bb8f6824f470caa118524dfd8fe057
+F test/table.test c3c0302f0481e2610f50ede7d20d8bfed40bdd11
 F test/tableapi.test 6a66d58b37d46dc0f2b3c7d4bd2617d209399bd1
 F test/tclsqlite.test 19578d32a7692311918caf0ae3521d19525bcb62
 F test/temptable.test 7927261befdbc7b0a7ffebb85ecc70a74fa7b15b
@@ -268,7 +268,7 @@ F tool/lempar.c 424df14a48736bb961ed47acf30c26d66ed85a62
 F tool/memleak.awk 4e7690a51bf3ed757e611273d43fe3f65b510133
 F tool/memleak2.awk 9cc20c8e8f3c675efac71ea0721ee6874a1566e8
 F tool/memleak3.tcl 7707006ee908cffff210c98158788d85bb3fcdbf
-F tool/mkkeywordhash.c 784791334097c4d6408067633a803819425b0e5e
+F tool/mkkeywordhash.c 9b4d521e1dbd3afbfb8d861f5309fc31ef218a0d
 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x
 F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c
 F tool/report1.txt 9eae07f26a8fc53889b45fc833a66a33daa22816
@@ -311,7 +311,7 @@ F www/fullscanb.gif f7c94cb227f060511f8909e10f570157263e9a25
 F www/index-ex1-x-b.gif f9b1d85c3fa2435cf38b15970c7e3aa1edae23a3
 F www/index.tcl 2217d1c755d3d4a421729135d1fd431fc0d7d67d
 F www/indirect1b1.gif adfca361d2df59e34f9c5cac52a670c2bfc303a1
-F www/lang.tcl 7015a52116d1ba3ce87cff6de7a98d5127e8f163
+F www/lang.tcl b6f6c0584a03a3b08912521196671033e7f8d80f
 F www/lockingv3.tcl f59b19d6c8920a931f096699d6faaf61c05db55f
 F www/mingw.tcl d96b451568c5d28545fefe0c80bee3431c73f69c
 F www/nulls.tcl ec35193f92485b87b90a994a01d0171b58823fcf
@@ -331,7 +331,7 @@ F www/tclsqlite.tcl ddcf912ea48695603c8ed7efb29f0812ef8d1b49
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P 5638a11ed5618dd833d3daffc1715951091d72b2
-R 4fcec6e31896f75351a3356ac180d0a7
+P 326fc9cc11c86f2d96763537d60757200ce21a84
+R e9c7dff42fb262ec45dcd10426410517
 U drh
-Z 51a8043067554832e2986a9a0acbf2b7
+Z d9e01061cde9ac664aadc0ebc289bbab
index 918a739cbee155f9fa13ece3f9ba5edb34a9a2a3..ebae3f191cdf5d9d3a0cd28e852eadbfcea0cc53 100644 (file)
@@ -1 +1 @@
-326fc9cc11c86f2d96763537d60757200ce21a84
\ No newline at end of file
+a4c547de83d8b27f06a58f9e530a7c983ec1dc3a
\ No newline at end of file
index 38f58028d491f0533d894763e2c79ec7e77b1f0d..39de2fdc9ad516a0e7f609ebb95d83e5af57278a 100644 (file)
@@ -22,7 +22,7 @@
 **     COMMIT
 **     ROLLBACK
 **
-** $Id: build.c,v 1.361 2005/12/21 18:36:46 drh Exp $
+** $Id: build.c,v 1.362 2005/12/29 01:11:37 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -1754,7 +1754,7 @@ static void destroyTable(Parse *pParse, Table *pTab){
 ** This routine is called to do the work of a DROP TABLE statement.
 ** pName is the name of the table to be dropped.
 */
-void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView){
+void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){
   Table *pTab;
   Vdbe *v;
   sqlite3 *db = pParse->db;
@@ -1764,7 +1764,12 @@ void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView){
   assert( pName->nSrc==1 );
   pTab = sqlite3LocateTable(pParse, pName->a[0].zName, pName->a[0].zDatabase);
 
-  if( pTab==0 ) goto exit_drop_table;
+  if( pTab==0 ){
+    if( noErr ){
+      sqlite3ErrorClear(pParse);
+    }
+    goto exit_drop_table;
+  }
   iDb = pTab->iDb;
   assert( iDb>=0 && iDb<db->nDb );
 #ifndef SQLITE_OMIT_AUTHORIZATION
index f000a6ffdfecab0a2f6389415e499b9e23934a35..7fd8aa1203471ca8f0c58f9e301ef0a59e598ae1 100644 (file)
@@ -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.188 2005/12/16 01:06:17 drh Exp $
+** @(#) $Id: parse.y,v 1.189 2005/12/29 01:11:37 drh Exp $
 */
 
 // All token codes are small integers with #defines that begin with "TK_"
@@ -172,7 +172,7 @@ id(A) ::= ID(X).         {A = X;}
 %ifdef SQLITE_OMIT_COMPOUND_SELECT
   EXCEPT INTERSECT UNION
 %endif
-  REINDEX RENAME CTIME_KW
+  REINDEX RENAME CTIME_KW IF
   .
 
 // Define operator precedence early so that this is the first occurance
@@ -336,9 +336,12 @@ resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
 
 ////////////////////////// The DROP TABLE /////////////////////////////////////
 //
-cmd ::= DROP TABLE fullname(X). {
-  sqlite3DropTable(pParse, X, 0);
+cmd ::= DROP TABLE ifexists(E) fullname(X). {
+  sqlite3DropTable(pParse, X, 0, E);
 }
+%type ifexists {int}
+ifexists(A) ::= IF EXISTS.   {A = 1;}
+ifexists(A) ::= .            {A = 0;}
 
 ///////////////////// The CREATE VIEW statement /////////////////////////////
 //
@@ -346,8 +349,8 @@ cmd ::= DROP TABLE fullname(X). {
 cmd ::= CREATE(X) temp(T) VIEW nm(Y) dbnm(Z) AS select(S). {
   sqlite3CreateView(pParse, &X, &Y, &Z, S, T);
 }
-cmd ::= DROP VIEW fullname(X). {
-  sqlite3DropTable(pParse, X, 1);
+cmd ::= DROP VIEW ifexists(E) fullname(X). {
+  sqlite3DropTable(pParse, X, 1, E);
 }
 %endif // SQLITE_OMIT_VIEW
 
index 5664ead07a41dc0d66588d71c8056fb207d99d41..b5ff1c20783eb45ec35d803e016aab2e0e34ec79 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Internal interface definitions for SQLite.
 **
-** @(#) $Id: sqliteInt.h,v 1.442 2005/12/20 09:19:37 danielk1977 Exp $
+** @(#) $Id: sqliteInt.h,v 1.443 2005/12/29 01:11:37 drh Exp $
 */
 #ifndef _SQLITEINT_H_
 #define _SQLITEINT_H_
@@ -1448,6 +1448,7 @@ void sqlite3DebugPrintf(const char*, ...);
 void *sqlite3TextToPtr(const char*);
 void sqlite3SetString(char **, ...);
 void sqlite3ErrorMsg(Parse*, const char*, ...);
+void sqlite3ErrorClear(Parse*);
 void sqlite3Dequote(char*);
 void sqlite3DequoteExpr(Expr*);
 int sqlite3KeywordCode(const unsigned char*, int);
@@ -1488,7 +1489,7 @@ void sqlite3EndTable(Parse*,Token*,Token*,Select*);
 # define sqlite3ViewGetColumnNames(A,B) 0
 #endif
 
-void sqlite3DropTable(Parse*, SrcList*, int);
+void sqlite3DropTable(Parse*, SrcList*, int, int);
 void sqlite3DeleteTable(sqlite3*, Table*);
 void sqlite3Insert(Parse*, SrcList*, ExprList*, Select*, IdList*, int);
 int sqlite3ArrayAllocate(void**,int,int);
index 776f5db7800e5b5531e40430f4c100dc3e9dd232..898d3dedb7046d4423ea43821adb336834dfb7dc 100644 (file)
@@ -14,7 +14,7 @@
 ** This file contains functions for allocating memory, comparing
 ** strings, and stuff like that.
 **
-** $Id: util.c,v 1.158 2005/12/20 14:38:00 danielk1977 Exp $
+** $Id: util.c,v 1.159 2005/12/29 01:11:37 drh Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -761,6 +761,15 @@ void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){
   va_end(ap);
 }
 
+/*
+** Clear the error message in pParse, if any
+*/
+void sqlite3ErrorClear(Parse *pParse){
+  sqliteFree(pParse->zErrMsg);
+  pParse->zErrMsg = 0;
+  pParse->nErr = 0;
+}
+
 /*
 ** Convert an SQL-style quoted string into a normal string by removing
 ** the quote characters.  The conversion is done in-place.  If the
@@ -1331,5 +1340,3 @@ void sqlite3MallocAllow(){
   sqlite3Tsd()->mallocAllowed = 1;
 }
 #endif
-
-
index 1817105a625140130d620edf4d0aa02dd4e34c3a..b5c2e4d14f953503baa83bcff05facfb99294c72 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is testing the CREATE TABLE statement.
 #
-# $Id: table.test,v 1.41 2005/09/10 15:35:07 drh Exp $
+# $Id: table.test,v 1.42 2005/12/29 01:11:37 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -238,16 +238,17 @@ do_test table-4.3 {
 
 # Try to drop a table that does not exist
 #
-do_test table-5.1 {
-  set v [catch {execsql {DROP TABLE test009}} msg]
-  lappend v $msg
+do_test table-5.1.1 {
+  catchsql {DROP TABLE test009}
 } {1 {no such table: test009}}
+do_test table-5.1.2 {
+  catchsql {DROP TABLE IF EXISTS test009}
+} {0 {}}
 
 # Try to drop sqlite_master
 #
 do_test table-5.2 {
-  set v [catch {execsql {DROP TABLE sqlite_master}} msg]
-  lappend v $msg
+  catchsql {DROP TABLE IF EXISTS sqlite_master}
 } {1 {table sqlite_master may not be dropped}}
 
 # Make sure an EXPLAIN does not really create a new table
index d2b11de5d01269871defba407b5cfa3ded0477f4..209276420134a4e9c4130ccc4db2d83d43f9384d 100644 (file)
@@ -165,6 +165,7 @@ static Keyword aKeywordTable[] = {
   { "GLOB",             "TK_LIKE_KW",      ALWAYS                 },
   { "GROUP",            "TK_GROUP",        ALWAYS                 },
   { "HAVING",           "TK_HAVING",       ALWAYS                 },
+  { "IF",               "TK_IF",           ALWAYS                 },
   { "IGNORE",           "TK_IGNORE",       CONFLICT|TRIGGER       },
   { "IMMEDIATE",        "TK_IMMEDIATE",    ALWAYS                 },
   { "IN",               "TK_IN",           ALWAYS                 },
index 5306ae963d5deebe870c1ae131682db2bada00dd..6fa3e653f0423514294e5ccd5574c0a7f7bff354 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Run this Tcl script to generate the lang-*.html files.
 #
-set rcsid {$Id: lang.tcl,v 1.102 2005/11/14 11:51:46 drh Exp $}
+set rcsid {$Id: lang.tcl,v 1.103 2005/12/29 01:11:37 drh Exp $}
 source common.tcl
 
 if {[llength $argv]>0} {
@@ -875,7 +875,7 @@ will be freed automatically by DROP INDEX.</p>
 Section {DROP TABLE} droptable
 
 Syntax {sql-command} {
-DROP TABLE [<database-name>.] <table-name>
+DROP TABLE [IF EXISTS] [<database-name>.] <table-name>
 }
 
 puts {
@@ -891,6 +891,9 @@ later INSERTs.  To
 remove free space in the database, use the <a href="#vacuum">VACUUM</a> 
 command.  If AUTOVACUUM mode is enabled for a database then space
 will be freed automatically by DROP TABLE.</p>
+
+<p>The optional IF EXISTS clause suppresses the error that would normally
+result if the table does not exist.</p>
 }