1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-11 01:42:22 +03:00

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
This commit is contained in:
drh
2009-05-01 02:08:04 +00:00
parent eb4ac06f4e
commit 7fe45908cc
4 changed files with 53 additions and 13 deletions

View File

@@ -1,5 +1,5 @@
C More\scleanup,\setc.\sto\ssupport\sMSVC\scompiles.\s(CVS\s6582) 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-04-30T17:45:34 D 2009-05-01T02:08:04
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in 583e87706abc3026960ed759aff6371faf84c211 F Makefile.in 583e87706abc3026960ed759aff6371faf84c211
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -121,7 +121,7 @@ F src/global.c 448419c44ce0701104c2121b0e06919b44514c0c
F src/hash.c 0caea57f020226903cd8591125732e1e19f17f14 F src/hash.c 0caea57f020226903cd8591125732e1e19f17f14
F src/hash.h 457e230c3b2bd3c56742824d43b16618ff30d7c0 F src/hash.h 457e230c3b2bd3c56742824d43b16618ff30d7c0
F src/hwtime.h 4a1d45f4cae1f402ea19686acf24acf4f0cb53cb F src/hwtime.h 4a1d45f4cae1f402ea19686acf24acf4f0cb53cb
F src/insert.c cdb0f64e53c3d84949b96d50090cc31646fc2857 F src/insert.c 76667db0ca22b0c9f3a04625e5380612d9eb0ab5
F src/journal.c e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0 F src/journal.c e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0
F src/legacy.c 2ad5b52df322d0f132f66817095e0e79c8942611 F src/legacy.c 2ad5b52df322d0f132f66817095e0e79c8942611
F src/loadext.c 3f96631089fc4f3871a67f02f2e4fc7ea4d51edc F src/loadext.c 3f96631089fc4f3871a67f02f2e4fc7ea4d51edc
@@ -646,6 +646,7 @@ F test/tkt3773.test 430b06567ce40285dfd2c4834a2a61816403efeb
F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267 F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267
F test/tkt3793.test 3aa2efe55bc31fc9459618feea2016ea9a52b2af F test/tkt3793.test 3aa2efe55bc31fc9459618feea2016ea9a52b2af
F test/tkt3824.test 3da2f5c81b057e3ff355f5dfc9aa0cf0a92e0206 F test/tkt3824.test 3da2f5c81b057e3ff355f5dfc9aa0cf0a92e0206
F test/tkt3832.test 7ebd5ac82d1e430accd5eec9768044133a94c2aa
F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7 F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7
F test/trace.test 19ffbc09885c3321d56358a5738feae8587fb377 F test/trace.test 19ffbc09885c3321d56358a5738feae8587fb377
F test/trans.test d887cb07630dc39879a322d958ad8b006137485c F test/trans.test d887cb07630dc39879a322d958ad8b006137485c
@@ -726,7 +727,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
P 92b69481bd0eedf06599c40623b38a6f4990010a P 2cd9655e7313671f2bbe8d4a6f13246cbbf61205
R 1fb8411f09203d4b0b597f4bb4bb4448 R 8ad70b144833bbdff165cb6ab4489cc8
U shane U drh
Z c3fcacee57f0e52fd4f695bca1750e29 Z 62d906d73f4d5c255b59654f71b42323

View File

@@ -1 +1 @@
2cd9655e7313671f2bbe8d4a6f13246cbbf61205 4a1f6a3a9ac8b476c86edac83b555adeef0be4e6

View File

@@ -12,7 +12,7 @@
** This file contains C code routines that are called by the parser ** This file contains C code routines that are called by the parser
** to handle INSERT statements in SQLite. ** 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" #include "sqliteInt.h"
@@ -781,12 +781,14 @@ void sqlite3Insert(
regTrigRowid = sqlite3GetTempReg(pParse); regTrigRowid = sqlite3GetTempReg(pParse);
if( keyColumn<0 ){ if( keyColumn<0 ){
sqlite3VdbeAddOp2(v, OP_Integer, -1, regTrigRowid); sqlite3VdbeAddOp2(v, OP_Integer, -1, regTrigRowid);
}else if( useTempTable ){
sqlite3VdbeAddOp3(v, OP_Column, srcTab, keyColumn, regTrigRowid);
}else{ }else{
int j1; int j1;
assert( pSelect==0 ); /* Otherwise useTempTable is true */ if( useTempTable ){
sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regTrigRowid); 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); j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regTrigRowid);
sqlite3VdbeAddOp2(v, OP_Integer, -1, regTrigRowid); sqlite3VdbeAddOp2(v, OP_Integer, -1, regTrigRowid);
sqlite3VdbeJumpHere(v, j1); sqlite3VdbeJumpHere(v, j1);

37
test/tkt3832.test Normal file
View File

@@ -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