Annotation of embedaddon/sqlite3/test/misc3.test, revision 1.1.1.1

1.1       misho       1: # 2003 December 17
                      2: #
                      3: # The author disclaims copyright to this source code.  In place of
                      4: # a legal notice, here is a blessing:
                      5: #
                      6: #    May you do good and not evil.
                      7: #    May you find forgiveness for yourself and forgive others.
                      8: #    May you share freely, never taking more than you give.
                      9: #
                     10: #***********************************************************************
                     11: # This file implements regression tests for SQLite library.
                     12: #
                     13: # This file implements tests for miscellanous features that were
                     14: # left out of other test files.
                     15: #
                     16: # $Id: misc3.test,v 1.20 2009/05/06 00:49:01 drh Exp $
                     17: 
                     18: set testdir [file dirname $argv0]
                     19: source $testdir/tester.tcl
                     20: 
                     21: ifcapable {integrityck} {
                     22:   # Ticket #529.  Make sure an ABORT does not damage the in-memory cache
                     23:   # that will be used by subsequent statements in the same transaction.
                     24:   #
                     25:   do_test misc3-1.1 {
                     26:     execsql {
                     27:       CREATE TABLE t1(a UNIQUE,b);
                     28:       INSERT INTO t1
                     29:         VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');
                     30:       UPDATE t1 SET b=b||b;
                     31:       UPDATE t1 SET b=b||b;
                     32:       UPDATE t1 SET b=b||b;
                     33:       UPDATE t1 SET b=b||b;
                     34:       UPDATE t1 SET b=b||b;
                     35:       INSERT INTO t1 VALUES(2,'x');
                     36:       UPDATE t1 SET b=substr(b,1,500);
                     37:       BEGIN;
                     38:     }
                     39:     catchsql {UPDATE t1 SET a=CASE a WHEN 2 THEN 1 ELSE a END, b='y';}
                     40:     execsql {
                     41:       CREATE TABLE t2(x,y);
                     42:       COMMIT;
                     43:       PRAGMA integrity_check;
                     44:     }
                     45:   } ok
                     46: }
                     47: ifcapable {integrityck} {
                     48:   do_test misc3-1.2 {
                     49:     execsql {
                     50:       DROP TABLE t1;
                     51:       DROP TABLE t2;
                     52:     }
                     53:     ifcapable {vacuum} {execsql VACUUM}
                     54:     execsql {
                     55:       CREATE TABLE t1(a UNIQUE,b);
                     56:       INSERT INTO t1
                     57:       VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');
                     58:       INSERT INTO t1 SELECT a+1, b||b FROM t1;
                     59:       INSERT INTO t1 SELECT a+2, b||b FROM t1;
                     60:       INSERT INTO t1 SELECT a+4, b FROM t1;
                     61:       INSERT INTO t1 SELECT a+8, b FROM t1;
                     62:       INSERT INTO t1 SELECT a+16, b FROM t1;
                     63:       INSERT INTO t1 SELECT a+32, b FROM t1;
                     64:       INSERT INTO t1 SELECT a+64, b FROM t1;
                     65:       BEGIN;
                     66:     }
                     67:     catchsql {UPDATE t1 SET a=CASE a WHEN 128 THEN 127 ELSE a END, b='';}
                     68:     execsql {
                     69:       INSERT INTO t1 VALUES(200,'hello out there');
                     70:       COMMIT;
                     71:       PRAGMA integrity_check;
                     72:     }
                     73:   } ok
                     74: }
                     75: 
                     76: # Tests of the sqliteAtoF() function in util.c
                     77: #
                     78: do_test misc3-2.1 {
                     79:   execsql {SELECT 2e-25*0.5e25}
                     80: } 1.0
                     81: do_test misc3-2.2 {
                     82:   execsql {SELECT 2.0e-25*000000.500000000000000000000000000000e+00025}
                     83: } 1.0
                     84: do_test misc3-2.3 {
                     85:   execsql {SELECT 000000000002e-0000000025*0.5e25}
                     86: } 1.0
                     87: do_test misc3-2.4 {
                     88:   execsql {SELECT 2e-25*0.5e250}
                     89: } 1e+225
                     90: do_test misc3-2.5 {
                     91:   execsql {SELECT 2.0e-250*0.5e25}
                     92: } 1e-225
                     93: do_test misc3-2.6 {
                     94:   execsql {SELECT '-2.0e-127' * '-0.5e27'}
                     95: } 1e-100
                     96: do_test misc3-2.7 {
                     97:   execsql {SELECT '+2.0e-127' * '-0.5e27'}
                     98: } -1e-100
                     99: do_test misc3-2.8 {
                    100:   execsql {SELECT 2.0e-27 * '+0.5e+127'}
                    101: } 1e+100
                    102: do_test misc3-2.9 {
                    103:   execsql {SELECT 2.0e-27 * '+0.000005e+132'}
                    104: } 1e+100
                    105: 
                    106: # Ticket #522.  Make sure integer overflow is handled properly in
                    107: # indices.
                    108: #
                    109: integrity_check misc3-3.1
                    110: do_test misc3-3.2 {
                    111:   execsql {
                    112:     CREATE TABLE t2(a INT UNIQUE);
                    113:   }
                    114: } {}
                    115: integrity_check misc3-3.2.1
                    116: do_test misc3-3.3 {
                    117:   execsql {
                    118:     INSERT INTO t2 VALUES(2147483648);
                    119:   }
                    120: } {}
                    121: integrity_check misc3-3.3.1
                    122: do_test misc3-3.4 {
                    123:   execsql {
                    124:     INSERT INTO t2 VALUES(-2147483649);
                    125:   }
                    126: } {}
                    127: integrity_check misc3-3.4.1
                    128: do_test misc3-3.5 {
                    129:   execsql {
                    130:     INSERT INTO t2 VALUES(+2147483649);
                    131:   }
                    132: } {}
                    133: integrity_check misc3-3.5.1
                    134: do_test misc3-3.6 {
                    135:   execsql {
                    136:     INSERT INTO t2 VALUES(+2147483647);
                    137:     INSERT INTO t2 VALUES(-2147483648);
                    138:     INSERT INTO t2 VALUES(-2147483647);
                    139:     INSERT INTO t2 VALUES(2147483646);
                    140:     SELECT * FROM t2 ORDER BY a;
                    141:   }
                    142: } {-2147483649 -2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
                    143: do_test misc3-3.7 {
                    144:   execsql {
                    145:     SELECT * FROM t2 WHERE a>=-2147483648 ORDER BY a;
                    146:   }
                    147: } {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
                    148: do_test misc3-3.8 {
                    149:   execsql {
                    150:     SELECT * FROM t2 WHERE a>-2147483648 ORDER BY a;
                    151:   }
                    152: } {-2147483647 2147483646 2147483647 2147483648 2147483649}
                    153: do_test misc3-3.9 {
                    154:   execsql {
                    155:     SELECT * FROM t2 WHERE a>-2147483649 ORDER BY a;
                    156:   }
                    157: } {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
                    158: do_test misc3-3.10 {
                    159:   execsql {
                    160:     SELECT * FROM t2 WHERE a>=0 AND a<2147483649 ORDER BY a DESC;
                    161:   }
                    162: } {2147483648 2147483647 2147483646}
                    163: do_test misc3-3.11 {
                    164:   execsql {
                    165:     SELECT * FROM t2 WHERE a>=0 AND a<=2147483648 ORDER BY a DESC;
                    166:   }
                    167: } {2147483648 2147483647 2147483646}
                    168: do_test misc3-3.12 {
                    169:   execsql {
                    170:     SELECT * FROM t2 WHERE a>=0 AND a<2147483648 ORDER BY a DESC;
                    171:   }
                    172: } {2147483647 2147483646}
                    173: do_test misc3-3.13 {
                    174:   execsql {
                    175:     SELECT * FROM t2 WHERE a>=0 AND a<=2147483647 ORDER BY a DESC;
                    176:   }
                    177: } {2147483647 2147483646}
                    178: do_test misc3-3.14 {
                    179:   execsql {
                    180:     SELECT * FROM t2 WHERE a>=0 AND a<2147483647 ORDER BY a DESC;
                    181:   }
                    182: } {2147483646}
                    183: 
                    184: # Ticket #565.  A stack overflow is occurring when the subquery to the
                    185: # right of an IN operator contains many NULLs
                    186: #
                    187: do_test misc3-4.1 {
                    188:   execsql {
                    189:     CREATE TABLE t3(a INTEGER PRIMARY KEY, b);
                    190:     INSERT INTO t3(b) VALUES('abc');
                    191:     INSERT INTO t3(b) VALUES('xyz');
                    192:     INSERT INTO t3(b) VALUES(NULL);
                    193:     INSERT INTO t3(b) VALUES(NULL);
                    194:     INSERT INTO t3(b) SELECT b||'d' FROM t3;
                    195:     INSERT INTO t3(b) SELECT b||'e' FROM t3;
                    196:     INSERT INTO t3(b) SELECT b||'f' FROM t3;
                    197:     INSERT INTO t3(b) SELECT b||'g' FROM t3;
                    198:     INSERT INTO t3(b) SELECT b||'h' FROM t3;
                    199:     SELECT count(a), count(b) FROM t3;
                    200:   }
                    201: } {128 64}
                    202: ifcapable subquery {
                    203: do_test misc3-4.2 {
                    204:     execsql {
                    205:       SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3);
                    206:     }
                    207:   } {64}
                    208:   do_test misc3-4.3 {
                    209:     execsql {
                    210:       SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3 ORDER BY a+1);
                    211:     }
                    212:   } {64}
                    213: }
                    214: 
                    215: # Ticket #601:  Putting a left join inside "SELECT * FROM (<join-here>)"
                    216: # gives different results that if the outer "SELECT * FROM ..." is omitted.
                    217: #
                    218: ifcapable subquery {
                    219:   do_test misc3-5.1 {
                    220:     execsql {
                    221:       CREATE TABLE x1 (b, c);
                    222:       INSERT INTO x1 VALUES('dog',3);
                    223:       INSERT INTO x1 VALUES('cat',1);
                    224:       INSERT INTO x1 VALUES('dog',4);
                    225:       CREATE TABLE x2 (c, e);
                    226:       INSERT INTO x2 VALUES(1,'one');
                    227:       INSERT INTO x2 VALUES(2,'two');
                    228:       INSERT INTO x2 VALUES(3,'three');
                    229:       INSERT INTO x2 VALUES(4,'four');
                    230:       SELECT x2.c AS c, e, b FROM x2 LEFT JOIN
                    231:          (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b)
                    232:          USING(c);
                    233:     }
                    234:   } {1 one cat 2 two {} 3 three {} 4 four dog}
                    235:   do_test misc3-5.2 {
                    236:     execsql {
                    237:       SELECT * FROM (
                    238:         SELECT x2.c AS c, e, b FROM x2 LEFT JOIN
                    239:            (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b)
                    240:            USING(c)
                    241:       );
                    242:     }
                    243:   } {1 one cat 2 two {} 3 three {} 4 four dog}
                    244: }
                    245: 
                    246: ifcapable {explain} {
                    247:   # Ticket #626:  make sure EXPLAIN prevents BEGIN and COMMIT from working.
                    248:   #
                    249:   do_test misc3-6.1 {
                    250:     execsql {EXPLAIN BEGIN}
                    251:     catchsql {BEGIN}
                    252:   } {0 {}}
                    253:   do_test misc3-6.2 {
                    254:     execsql {EXPLAIN COMMIT}
                    255:     catchsql {COMMIT}
                    256:   } {0 {}}
                    257:   do_test misc3-6.3 {
                    258:     execsql {BEGIN; EXPLAIN ROLLBACK}
                    259:     catchsql {ROLLBACK}
                    260:   } {0 {}}
                    261: 
                    262:   # Do some additional EXPLAIN operations to exercise the displayP4 logic.
                    263:   do_test misc3-6.10 {
                    264:     set x [execsql {
                    265:       CREATE TABLE ex1(
                    266:         a INTEGER DEFAULT 54321,
                    267:         b TEXT DEFAULT "hello",
                    268:         c REAL DEFAULT 3.1415926
                    269:       );
                    270:       CREATE UNIQUE INDEX ex1i1 ON ex1(a);
                    271:       EXPLAIN REINDEX;
                    272:     }]
                    273:     ifcapable mergesort {
                    274:       regexp { SorterCompare \d+ \d+ \d+ } $x
                    275:     } else {
                    276:       regexp { IsUnique \d+ \d+ \d+ \d+ } $x
                    277:     }
                    278:   } {1}
                    279:   if {[regexp {16} [db one {PRAGMA encoding}]]} {
                    280:     do_test misc3-6.11-utf16 {
                    281:       set x [execsql {
                    282:         EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC
                    283:       }]
                    284:       set y [regexp { 123456789012 } $x]
                    285:       lappend y [regexp { 4.5678 } $x]
                    286:       lappend y [regexp {,-BINARY} $x]
                    287:     } {1 1 1}
                    288:   } else {
                    289:     do_test misc3-6.11-utf8 {
                    290:       set x [execsql {
                    291:         EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC
                    292:       }]
                    293:       set y [regexp { 123456789012 } $x]
                    294:       lappend y [regexp { 4.5678 } $x]
                    295:       lappend y [regexp { hello } $x]
                    296:       lappend y [regexp {,-BINARY} $x]
                    297:     } {1 1 1 1}
                    298:   }
                    299: }
                    300: 
                    301: ifcapable {trigger} {
                    302: # Ticket #640:  vdbe stack overflow with a LIMIT clause on a SELECT inside
                    303: # of a trigger.
                    304: #
                    305: do_test misc3-7.1 {
                    306:   execsql {
                    307:     BEGIN;
                    308:     CREATE TABLE y1(a);
                    309:     CREATE TABLE y2(b);
                    310:     CREATE TABLE y3(c);
                    311:     CREATE TRIGGER r1 AFTER DELETE ON y1 FOR EACH ROW BEGIN
                    312:       INSERT INTO y3(c) SELECT b FROM y2 ORDER BY b LIMIT 1;
                    313:     END;
                    314:     INSERT INTO y1 VALUES(1);
                    315:     INSERT INTO y1 VALUES(2);
                    316:     INSERT INTO y1 SELECT a+2 FROM y1;
                    317:     INSERT INTO y1 SELECT a+4 FROM y1;
                    318:     INSERT INTO y1 SELECT a+8 FROM y1;
                    319:     INSERT INTO y1 SELECT a+16 FROM y1;
                    320:     INSERT INTO y2 SELECT a FROM y1;
                    321:     COMMIT;
                    322:     SELECT count(*) FROM y1;
                    323:   }
                    324: } 32
                    325: do_test misc3-7.2 {
                    326:   execsql {
                    327:     DELETE FROM y1;
                    328:     SELECT count(*) FROM y1;
                    329:   }
                    330: } 0
                    331: do_test misc3-7.3 {
                    332:   execsql {
                    333:     SELECT count(*) FROM y3;
                    334:   }
                    335: } 32
                    336: } ;# endif trigger
                    337: 
                    338: # Ticket #668:  VDBE stack overflow occurs when the left-hand side
                    339: # of an IN expression is NULL and the result is used as an integer, not
                    340: # as a jump.
                    341: #
                    342: ifcapable subquery {
                    343:   do_test misc-8.1 {
                    344:     execsql {
                    345:       SELECT count(CASE WHEN b IN ('abc','xyz') THEN 'x' END) FROM t3
                    346:     }
                    347:   } {2}
                    348:   do_test misc-8.2 {
                    349:     execsql {
                    350:       SELECT count(*) FROM t3 WHERE 1+(b IN ('abc','xyz'))==2
                    351:     }
                    352:   } {2}
                    353: }
                    354: 
                    355: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>