From 7fe45908cca96941228577134800955a065bee7a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 May 2009 02:08:04 +0000 Subject: [PATCH] Fix processing of BEFORE triggers on INSERT statements with RHS SELECTs that insert a NULL into the INTEGER PRIMARY KEY. Ticket #3832. (CVS 6583) FossilOrigin-Name: 4a1f6a3a9ac8b476c86edac83b555adeef0be4e6 --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/insert.c | 12 +++++++----- test/tkt3832.test | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 test/tkt3832.test diff --git a/manifest b/manifest index 8d049d7a66..64f2f145a6 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index e987d2cff1..52a7d63fd6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2cd9655e7313671f2bbe8d4a6f13246cbbf61205 \ No newline at end of file +4a1f6a3a9ac8b476c86edac83b555adeef0be4e6 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 6ed61cf378..b20a04eec8 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.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 index 0000000000..9c733071a9 --- /dev/null +++ b/test/tkt3832.test @@ -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 -- 2.47.2