]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix processing of BEFORE triggers on INSERT statements with RHS SELECTs
authordrh <drh@noemail.net>
Fri, 1 May 2009 02:08:04 +0000 (02:08 +0000)
committerdrh <drh@noemail.net>
Fri, 1 May 2009 02:08:04 +0000 (02:08 +0000)
that insert a NULL into the INTEGER PRIMARY KEY.  Ticket #3832. (CVS 6583)

FossilOrigin-Name: 4a1f6a3a9ac8b476c86edac83b555adeef0be4e6

manifest
manifest.uuid
src/insert.c
test/tkt3832.test [new file with mode: 0644]

index 8d049d7a66a3f1344e2cf3d539a3aa8dade5c2c9..64f2f145a6a5c152ae95d279d56292ee440f2e32 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C More\scleanup,\setc.\sto\ssupport\sMSVC\scompiles.\s(CVS\s6582)
-D 2009-04-30T17:45:34
+C Fix\sprocessing\sof\sBEFORE\striggers\son\sINSERT\sstatements\swith\sRHS\sSELECTs\nthat\sinsert\sa\sNULL\sinto\sthe\sINTEGER\sPRIMARY\sKEY.\s\sTicket\s#3832.\s(CVS\s6583)
+D 2009-05-01T02:08:04
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 583e87706abc3026960ed759aff6371faf84c211
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -121,7 +121,7 @@ F src/global.c 448419c44ce0701104c2121b0e06919b44514c0c
 F src/hash.c 0caea57f020226903cd8591125732e1e19f17f14
 F src/hash.h 457e230c3b2bd3c56742824d43b16618ff30d7c0
 F src/hwtime.h 4a1d45f4cae1f402ea19686acf24acf4f0cb53cb
-F src/insert.c cdb0f64e53c3d84949b96d50090cc31646fc2857
+F src/insert.c 76667db0ca22b0c9f3a04625e5380612d9eb0ab5
 F src/journal.c e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0
 F src/legacy.c 2ad5b52df322d0f132f66817095e0e79c8942611
 F src/loadext.c 3f96631089fc4f3871a67f02f2e4fc7ea4d51edc
@@ -646,6 +646,7 @@ F test/tkt3773.test 430b06567ce40285dfd2c4834a2a61816403efeb
 F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267
 F test/tkt3793.test 3aa2efe55bc31fc9459618feea2016ea9a52b2af
 F test/tkt3824.test 3da2f5c81b057e3ff355f5dfc9aa0cf0a92e0206
+F test/tkt3832.test 7ebd5ac82d1e430accd5eec9768044133a94c2aa
 F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7
 F test/trace.test 19ffbc09885c3321d56358a5738feae8587fb377
 F test/trans.test d887cb07630dc39879a322d958ad8b006137485c
@@ -726,7 +727,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P 92b69481bd0eedf06599c40623b38a6f4990010a
-R 1fb8411f09203d4b0b597f4bb4bb4448
-U shane
-Z c3fcacee57f0e52fd4f695bca1750e29
+P 2cd9655e7313671f2bbe8d4a6f13246cbbf61205
+R 8ad70b144833bbdff165cb6ab4489cc8
+U drh
+Z 62d906d73f4d5c255b59654f71b42323
index e987d2cff10e91234b05b3efea82557c9311c77a..52a7d63fd60fa5a3034b20e3033109ba1f488591 100644 (file)
@@ -1 +1 @@
-2cd9655e7313671f2bbe8d4a6f13246cbbf61205
\ No newline at end of file
+4a1f6a3a9ac8b476c86edac83b555adeef0be4e6
\ No newline at end of file
index 6ed61cf378304d309ad52f09d229bb5314970d60..b20a04eec8ab94979ddbf6fdab297f6434600c1d 100644 (file)
@@ -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.261 2009/04/30 00:11:10 drh Exp $
+** $Id: insert.c,v 1.262 2009/05/01 02:08:04 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -781,12 +781,14 @@ void sqlite3Insert(
     regTrigRowid = sqlite3GetTempReg(pParse);
     if( keyColumn<0 ){
       sqlite3VdbeAddOp2(v, OP_Integer, -1, regTrigRowid);
-    }else if( useTempTable ){
-      sqlite3VdbeAddOp3(v, OP_Column, srcTab, keyColumn, regTrigRowid);
     }else{
       int j1;
-      assert( pSelect==0 );  /* Otherwise useTempTable is true */
-      sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regTrigRowid);
+      if( useTempTable ){
+        sqlite3VdbeAddOp3(v, OP_Column, srcTab, keyColumn, regTrigRowid);
+      }else{
+        assert( pSelect==0 );  /* Otherwise useTempTable is true */
+        sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regTrigRowid);
+      }
       j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regTrigRowid);
       sqlite3VdbeAddOp2(v, OP_Integer, -1, regTrigRowid);
       sqlite3VdbeJumpHere(v, j1);
diff --git a/test/tkt3832.test b/test/tkt3832.test
new file mode 100644 (file)
index 0000000..9c73307
--- /dev/null
@@ -0,0 +1,37 @@
+# 2009 April 30                                                            
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# Ticket #3832
+#
+# A segfault when using a BEFORE trigger on an INSERT and inserting
+# a NULL into the INTEGER PRIMARY KEY.
+#
+# $Id: tkt3832.test,v 1.1 2009/05/01 02:08:04 drh Exp $
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+
+do_test tkt3832-1.1 {
+  db eval {
+    CREATE TABLE t1(a INT, b INTEGER PRIMARY KEY);
+    CREATE TABLE log(x);
+    CREATE TRIGGER t1r1 BEFORE INSERT ON t1 BEGIN
+      INSERT INTO log VALUES(new.b);
+    END;
+    INSERT INTO t1 VALUES(NULL,5);
+    INSERT INTO t1 SELECT b, a FROM t1 ORDER BY b;
+    SELECT rowid, * FROM t1;
+    SELECT rowid, * FROM log;
+  }
+} {5 {} 5 6 5 6 1 5 2 -1}
+
+finish_test