Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Improved test coverage on insert.c. (CVS 2210) |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
c772f75166d55192132e732e8a0ddda5 |
User & Date: | drh 2005-01-14 01:22:01 |
Context
2005-01-14
| ||
13:50 | Experimental patch to balance() (use -DSQLITE_BALANCE_QUICK). (CVS 2211) check-in: c550d80c user: danielk1977 tags: trunk | |
01:22 | Improved test coverage on insert.c. (CVS 2210) check-in: c772f751 user: drh tags: trunk | |
2005-01-13
| ||
23:54 | Need SQLITE_MEMDEBUG instead of SQLITE_DEBUG in tclsqlite.c. (CVS 2209) check-in: 6e905270 user: drh tags: trunk | |
Changes
Changes to src/insert.c.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 ... 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 |
** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle INSERT statements in SQLite. ** ** $Id: insert.c,v 1.129 2005/01/10 02:48:49 danielk1977 Exp $ */ #include "sqliteInt.h" /* ** Set P3 of the most recently inserted opcode to a column affinity ** string for index pIdx. A column affinity string has one character ** for each column in the table, according to the affinity of the column: ................................................................................ ** we do not know what the unique ID will be (because the insert has ** not happened yet) so we substitute a rowid of -1 */ if( keyColumn<0 ){ sqlite3VdbeAddOp(v, OP_Integer, -1, 0); }else if( useTempTable ){ sqlite3VdbeAddOp(v, OP_Column, srcTab, keyColumn); }else if( pSelect ){ sqlite3VdbeAddOp(v, OP_Dup, nColumn - keyColumn - 1, 1); }else{ sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr); sqlite3VdbeAddOp(v, OP_NotNull, -1, sqlite3VdbeCurrentAddr(v)+3); sqlite3VdbeAddOp(v, OP_Pop, 1, 0); sqlite3VdbeAddOp(v, OP_Integer, -1, 0); sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); } ................................................................................ if( pColumn->a[j].idx==i ) break; } } if( pColumn && j>=pColumn->nId ){ sqlite3ExprCode(pParse, pTab->aCol[i].pDflt); }else if( useTempTable ){ sqlite3VdbeAddOp(v, OP_Column, srcTab, j); }else if( pSelect ){ sqlite3VdbeAddOp(v, OP_Dup, nColumn-j-1, 1); }else{ sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr); } } sqlite3VdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, ** do not attempt any conversions before assembling the record. |
| < < > < < > |
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 ... 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 |
** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle INSERT statements in SQLite. ** ** $Id: insert.c,v 1.130 2005/01/14 01:22:01 drh Exp $ */ #include "sqliteInt.h" /* ** Set P3 of the most recently inserted opcode to a column affinity ** string for index pIdx. A column affinity string has one character ** for each column in the table, according to the affinity of the column: ................................................................................ ** we do not know what the unique ID will be (because the insert has ** not happened yet) so we substitute a rowid of -1 */ if( keyColumn<0 ){ sqlite3VdbeAddOp(v, OP_Integer, -1, 0); }else if( useTempTable ){ sqlite3VdbeAddOp(v, OP_Column, srcTab, keyColumn); }else{ assert( pSelect==0 ); /* Otherwise useTempTable is true */ sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr); sqlite3VdbeAddOp(v, OP_NotNull, -1, sqlite3VdbeCurrentAddr(v)+3); sqlite3VdbeAddOp(v, OP_Pop, 1, 0); sqlite3VdbeAddOp(v, OP_Integer, -1, 0); sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); } ................................................................................ if( pColumn->a[j].idx==i ) break; } } if( pColumn && j>=pColumn->nId ){ sqlite3ExprCode(pParse, pTab->aCol[i].pDflt); }else if( useTempTable ){ sqlite3VdbeAddOp(v, OP_Column, srcTab, j); }else{ assert( pSelect==0 ); /* Otherwise useTempTable is true */ sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr); } } sqlite3VdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, ** do not attempt any conversions before assembling the record. |
Added test/insert3.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# 2005 January 13 # # 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. # #*********************************************************************** # 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.1 2005/01/14 01:22:01 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Create a table and a corresponding insert trigger. Do a self-insert # into the table. # do_test insert3-1.0 { execsql { CREATE TABLE t1(a,b); CREATE TABLE log(x UNIQUE, y); CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN UPDATE log SET y=y+1 WHERE x=new.a; INSERT OR IGNORE INTO log VALUES(new.a, 1); END; INSERT INTO t1 VALUES('hello','world'); INSERT INTO t1 VALUES(5,10); SELECT * FROM log ORDER BY x; } } {5 1 hello 1} do_test insert3-1.1 { execsql { INSERT INTO t1 SELECT a, b+10 FROM t1; SELECT * FROM log ORDER BY x; } } {5 2 hello 2} do_test insert3-1.2 { execsql { CREATE TABLE log2(x PRIMARY KEY,y); CREATE TRIGGER r2 BEFORE INSERT ON t1 BEGIN UPDATE log2 SET y=y+1 WHERE x=new.b; INSERT OR IGNORE INTO log2 VALUES(new.b,1); END; INSERT INTO t1 VALUES(453,'hi'); SELECT * FROM log ORDER BY x; } } {5 2 453 1 hello 2} do_test insert3-1.3 { execsql { SELECT * FROM log2 ORDER BY x; } } {hi 1} do_test insert3-1.4 { execsql { INSERT INTO t1 SELECT * FROM t1; SELECT 'a:', x, y FROM log UNION ALL SELECT 'b:', x, y FROM log2 ORDER BY x; } } {a: 5 4 b: 10 2 b: 20 1 a: 453 2 a: hello 4 b: hi 2 b: world 1} do_test insert3-1.5 { execsql { INSERT INTO t1(a) VALUES('xyz'); SELECT * FROM log ORDER BY x; } } {5 4 453 2 hello 4 xyz 1} do_test insert3-2.1 { execsql { CREATE TABLE t2( a INTEGER PRIMARY KEY, b DEFAULT 'b', c DEFAULT 'c' ); CREATE TABLE t2dup(a,b,c); CREATE TRIGGER t2r1 BEFORE INSERT ON t2 BEGIN INSERT INTO t2dup(a,b,c) VALUES(new.a,new.b,new.c); END; INSERT INTO t2(a) VALUES(123); INSERT INTO t2(b) VALUES(234); INSERT INTO t2(c) VALUES(345); SELECT * FROM t2dup; } } {123 b c -1 234 c -1 b 345} do_test insert3-2.2 { execsql { DELETE FROM t2dup; INSERT INTO t2(a) SELECT 1 FROM t1 LIMIT 1; INSERT INTO t2(b) SELECT 987 FROM t1 LIMIT 1; INSERT INTO t2(c) SELECT 876 FROM t1 LIMIT 1; SELECT * FROM t2dup; } } {1 b c -1 987 c -1 b 876} finish_test |