aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2006-08-25 23:42:53 +0000
committerdrh <drh@noemail.net>2006-08-25 23:42:53 +0000
commit147d0ccc15042f0733a6ef393b005a7a8cebdbef (patch)
tree23137fae6bcd9a1bb80e4a64188bb70547e3d6e9
parent0de250e46f4139d5495dcd10cfd29f619ce771c6 (diff)
downloadsqlite-147d0ccc15042f0733a6ef393b005a7a8cebdbef.tar.gz
sqlite-147d0ccc15042f0733a6ef393b005a7a8cebdbef.zip
Add support for INSERT INTO ... DEFAULT VALUES. Tickets #299, #1940. (CVS 3368)
FossilOrigin-Name: bc84cb54b0df09738fd90e48820dc3cdfa7828c2
-rw-r--r--manifest20
-rw-r--r--manifest.uuid2
-rw-r--r--src/insert.c12
-rw-r--r--src/parse.y4
-rw-r--r--src/tclsqlite.c4
-rw-r--r--test/insert3.test29
6 files changed, 48 insertions, 23 deletions
diff --git a/manifest b/manifest
index 2dff553ad..0d35188c7 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sgcc\sgripe\sabout\sparens\sin\sa\s||/&&\sin\smergePosList().\nDrop\sunused\spBlob/nBlob\sin\sindex_insert_term().\nFix\sNULL\sderef\sin\san\sassertion\sin\sdocListUpdate()\sdelete\scase.\nMinor\scode\stightening\sin\sdocListUpdate().\s(CVS\s3367)
-D 2006-08-25T19:20:26
+C Add\ssupport\sfor\sINSERT\sINTO\s...\sDEFAULT\sVALUES.\s\sTickets\s#299,\s#1940.\s(CVS\s3368)
+D 2006-08-25T23:42:53
F Makefile.in 8e7f9ecebab2c6e0f3db20ff129a8f9405ab64f8
F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -54,7 +54,7 @@ F src/expr.c 0546cc60f08c426d96092dea0789d085aed3580e
F src/func.c dd9cea8ed3246d7a4c49fd01034d470d5702b8b0
F src/hash.c 449f3d6620193aa557f5d86cbc5cc6b87702b185
F src/hash.h 1b3f7e2609141fd571f62199fc38687d262e9564
-F src/insert.c 63f01d3f4e0ba7ed171934a24aece2191824faec
+F src/insert.c 924d3cdd59a47d4a506fd13420b9c0b32d5ed377
F src/legacy.c 10e01a902d7f2c872c7922fedf19a2df70935857
F src/loadext.c 7a41142266dd2570fedf00108e1772047f98a673
F src/main.c 96ab5f29fe903aa8a28f6e1463a3b8245bf1c416
@@ -72,7 +72,7 @@ F src/os_win.c c6976ae50b61fb5b7dce399e578aa1865f02b84f
F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
F src/pager.c e51c079b3cad8394898a6c22330150339103700a
F src/pager.h 0cff9de5e9019cb695a04d18df8caaaff933a272
-F src/parse.y ec897a969f2b0488878f63c286bf466d38c55710
+F src/parse.y b26898e5270c3dc58798047e72cd57113663f761
F src/pragma.c dcb79b8170231f3aed99d4004b4d0a0fc14c4b4d
F src/prepare.c 84e2c855600c7bfbe2ca691b263301de525f9123
F src/printf.c b179b6ed12f793e028dd169e2e2e2b2a37eedc63
@@ -84,7 +84,7 @@ F src/sqlite.h.in 84ac26ca94a84dd603fb57a27d862f51bfd9f687
F src/sqlite3ext.h 11a046b3519c4b9b7709e6d6a95c3a36366f684a
F src/sqliteInt.h 325a2d45be2b22c1e21ad649e0a898c74eaec7de
F src/table.c d8817f43a6c6bf139487db161760b9e1e02da3f1
-F src/tclsqlite.c b706556687f0113e01d0574b0caa59c1cd4f3034
+F src/tclsqlite.c 4e97383988f6349b01f11b55946536a46e247aa3
F src/test1.c 535294d7f21a4127082c4f7a57f225482df9cc36
F src/test2.c ca74a1d8aeb7d9606e8f6b762c5daf85c1a3f92b
F src/test3.c 85135c09560c48bdb0a23c9b890ab405486b8ec9
@@ -192,7 +192,7 @@ F test/index2.test ee83c6b5e3173a3d7137140d945d9a5d4fdfb9d6
F test/index3.test f66718cd92ce1216819d47e6a156755e4b2c4ca1
F test/insert.test 42e26d9192f36859938765e6817fb957cf19532b
F test/insert2.test 5a20e1ace5fa0800b58d28284212290189b49aed
-F test/insert3.test 0096bd9766f94f4fa06ef712658e590b782cb44f
+F test/insert3.test 09a532d5b6f3a788d91be0d4d368462f522685d1
F test/interrupt.test c38b7f7c17914f0cd6a119beed5d03bc3f47f9eb
F test/intpkey.test af4fd826c4784ec5c93b444de07adea0254d0d30
F test/ioerr.test 804d56cfa698e7c90590921f984eb49ceb30c2a9
@@ -388,7 +388,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P e029637e54e190c89206725a99e1ee7db6c23804
-R 9ce35272ab9df42e9d49ed3b7fe1ef36
-U shess
-Z 3eca536fbc68da4d34c55754ff00f971
+P a6fcf9101a831bf5f129c6045eabf30376d365dc
+R 80b06007a2365db4d7bc49bb74bd766d
+U drh
+Z 3665a6d74cbe1ba1fd5fe6a0a1a1da6c
diff --git a/manifest.uuid b/manifest.uuid
index d5c22d260..0379321b0 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-a6fcf9101a831bf5f129c6045eabf30376d365dc \ No newline at end of file
+bc84cb54b0df09738fd90e48820dc3cdfa7828c2 \ No newline at end of file
diff --git a/src/insert.c b/src/insert.c
index 0c79d6e61..2ee5c79e2 100644
--- a/src/insert.c
+++ b/src/insert.c
@@ -12,7 +12,7 @@
** This file contains C code routines that are called by the parser
** to handle INSERT statements in SQLite.
**
-** $Id: insert.c,v 1.170 2006/06/19 03:05:10 danielk1977 Exp $
+** $Id: insert.c,v 1.171 2006/08/25 23:42:53 drh Exp $
*/
#include "sqliteInt.h"
@@ -387,11 +387,9 @@ void sqlite3Insert(
NameContext sNC;
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
- assert( pList!=0 );
srcTab = -1;
useTempTable = 0;
- assert( pList );
- nColumn = pList->nExpr;
+ nColumn = pList ? pList->nExpr : 0;
for(i=0; i<nColumn; i++){
if( sqlite3ExprResolveNames(&sNC, pList->a[i].pExpr) ){
goto insert_cleanup;
@@ -402,7 +400,7 @@ void sqlite3Insert(
/* Make sure the number of columns in the source data matches the number
** of columns to be inserted into the table.
*/
- if( pColumn==0 && nColumn!=pTab->nCol ){
+ if( pColumn==0 && nColumn && nColumn!=pTab->nCol ){
sqlite3ErrorMsg(pParse,
"table %S has %d columns but %d values were supplied",
pTabList, 0, pTab->nCol, nColumn);
@@ -455,7 +453,7 @@ void sqlite3Insert(
** key, the set the keyColumn variable to the primary key column index
** in the original table definition.
*/
- if( pColumn==0 ){
+ if( pColumn==0 && nColumn>0 ){
keyColumn = pTab->iPKey;
}
@@ -618,7 +616,7 @@ void sqlite3Insert(
if( pColumn->a[j].idx==i ) break;
}
}
- if( pColumn && j>=pColumn->nId ){
+ if( nColumn==0 || (pColumn && j>=pColumn->nId) ){
sqlite3ExprCode(pParse, pTab->aCol[i].pDflt);
}else if( useTempTable ){
sqlite3VdbeAddOp(v, OP_Column, srcTab, j);
diff --git a/src/parse.y b/src/parse.y
index 0c0575362..f9445113c 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.207 2006/08/14 14:23:42 drh Exp $
+** @(#) $Id: parse.y,v 1.208 2006/08/25 23:42:53 drh Exp $
*/
// All token codes are small integers with #defines that begin with "TK_"
@@ -600,6 +600,8 @@ cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F)
{sqlite3Insert(pParse, X, Y, 0, F, R);}
cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S).
{sqlite3Insert(pParse, X, 0, S, F, R);}
+cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES.
+ {sqlite3Insert(pParse, X, 0, 0, F, R);}
%type insert_cmd {int}
insert_cmd(A) ::= INSERT orconf(R). {A = R;}
diff --git a/src/tclsqlite.c b/src/tclsqlite.c
index e7b317041..622208378 100644
--- a/src/tclsqlite.c
+++ b/src/tclsqlite.c
@@ -11,7 +11,7 @@
*************************************************************************
** A TCL Interface to SQLite
**
-** $Id: tclsqlite.c,v 1.169 2006/08/24 14:59:46 drh Exp $
+** $Id: tclsqlite.c,v 1.170 2006/08/25 23:42:53 drh Exp $
*/
#ifndef NO_TCL /* Omit this whole file if TCL is unavailable */
@@ -2073,8 +2073,6 @@ static int DbMain(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
zArg = Tcl_GetStringFromObj(objv[1], 0);
Tcl_CreateObjCommand(interp, zArg, DbObjCmd, (char*)p, DbDeleteCmd);
- /* If a TCL procedure named "::sqlite3_init
-
/* If compiled with SQLITE_TEST turned on, then register the "md5sum"
** SQL function.
*/
diff --git a/test/insert3.test b/test/insert3.test
index a6a3a6bf7..62af4ddae 100644
--- a/test/insert3.test
+++ b/test/insert3.test
@@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The
# focus of this file is testing corner cases of the INSERT statement.
#
-# $Id: insert3.test,v 1.4 2006/01/23 18:42:21 drh Exp $
+# $Id: insert3.test,v 1.5 2006/08/25 23:42:53 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -138,4 +138,31 @@ do_test insert3-3.4 {
} ;# ifcapable {trigger}
+# Tests for the INSERT INTO ... DEFAULT VALUES construct
+#
+do_test insert4-3.5 {
+ execsql {
+ CREATE TABLE t5(
+ a INTEGER PRIMARY KEY,
+ b DEFAULT 'xyz'
+ );
+ INSERT INTO t5 DEFAULT VALUES;
+ SELECT * FROM t5;
+ }
+} {1 xyz}
+do_test insert4-3.6 {
+ execsql {
+ INSERT INTO t5 DEFAULT VALUES;
+ SELECT * FROM t5;
+ }
+} {1 xyz 2 xyz}
+do_test insert4-3.7 {
+ execsql {
+ CREATE TABLE t6(x,y DEFAULT 4.3, z DEFAULT x'6869');
+ INSERT INTO t6 DEFAULT VALUES;
+ SELECT * FROM t6;
+ }
+} {{} 4.3 hi}
+
+
finish_test