Annotation of embedaddon/sqlite3/test/misc3.test, revision 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>