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:
15
manifest
15
manifest
@@ -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
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2cd9655e7313671f2bbe8d4a6f13246cbbf61205
|
4a1f6a3a9ac8b476c86edac83b555adeef0be4e6
|
||||||
12
src/insert.c
12
src/insert.c
@@ -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
37
test/tkt3832.test
Normal 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
|
||||||
Reference in New Issue
Block a user