Annotation of embedaddon/sqlite3/test/misc7.test, revision 1.1

1.1     ! misho       1: # 2006 September 4
        !             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: # $Id: misc7.test,v 1.29 2009/07/16 18:21:18 drh Exp $
        !            14: 
        !            15: set testdir [file dirname $argv0]
        !            16: source $testdir/tester.tcl
        !            17: 
        !            18: do_test misc7-1-misuse {
        !            19:   c_misuse_test
        !            20: } {}
        !            21: 
        !            22: do_test misc7-2 {
        !            23:   c_realloc_test
        !            24: } {}
        !            25: 
        !            26: do_test misc7-3 {
        !            27:   c_collation_test
        !            28: } {}
        !            29: 
        !            30: # Try to open a directory:
        !            31: #
        !            32: do_test misc7-4 {
        !            33:   delete_file mydir
        !            34:   file mkdir mydir
        !            35:   set rc [catch {
        !            36:     sqlite3 db2 ./mydir
        !            37:   } msg]
        !            38:   list $rc $msg
        !            39: } {1 {unable to open database file}}
        !            40: 
        !            41: # Try to open a file with a directory where its journal file should be.
        !            42: #
        !            43: do_test misc7-5 {
        !            44:   delete_file mydir
        !            45:   file mkdir mydir-journal
        !            46:   sqlite3 db2 ./mydir
        !            47:   catchsql {
        !            48:     CREATE TABLE abc(a, b, c);
        !            49:   } db2
        !            50: } {1 {unable to open database file}}
        !            51: db2 close
        !            52: 
        !            53: #--------------------------------------------------------------------
        !            54: # The following tests, misc7-6.* test the libraries behaviour when
        !            55: # it cannot open a file. To force this condition, we use up all the
        !            56: # file-descriptors before running sqlite. This probably only works
        !            57: # on unix.
        !            58: #
        !            59: 
        !            60: proc use_up_files {} {
        !            61:   set ret [list]
        !            62:   catch {
        !            63:     while 1 { lappend ret [open test.db] }
        !            64:   }
        !            65:   return $ret
        !            66: }
        !            67: 
        !            68: proc do_fileopen_test {prefix sql} {
        !            69:   set fd_list [use_up_files]
        !            70:   set ::go 1
        !            71:   set ::n 1
        !            72:   set ::sql $sql
        !            73:   while {$::go} {
        !            74:     catch {db close}
        !            75:     do_test ${prefix}.${::n} {
        !            76:       set rc [catch {
        !            77:         sqlite db test.db
        !            78:         db eval $::sql
        !            79:       } msg]
        !            80:       if {$rc == 0} {set ::go 0}
        !            81:   
        !            82:       expr {$rc == 0 || ($rc == 1 && [string first unable $msg]==0)}
        !            83:     } 1
        !            84:   
        !            85:     close [lindex $fd_list 0]
        !            86:     set fd_list [lrange $fd_list 1 end]
        !            87:     incr ::n
        !            88:   }
        !            89:   foreach fd $fd_list {
        !            90:     close $fd
        !            91:   }
        !            92:   db close
        !            93: }
        !            94: 
        !            95: execsql { CREATE TABLE abc(a PRIMARY KEY, b, c); }
        !            96: db close
        !            97: 
        !            98: if {$tcl_platform(platform)!="windows"} {
        !            99:   do_fileopen_test misc7-6.1 {
        !           100:     BEGIN;
        !           101:     INSERT INTO abc VALUES(1, 2, 3);
        !           102:     INSERT INTO abc VALUES(2, 3, 4);
        !           103:     INSERT INTO abc SELECT a+2, b, c FROM abc;
        !           104:     COMMIT;
        !           105:   }
        !           106:   
        !           107:   do_fileopen_test misc7-6.2 {
        !           108:     PRAGMA temp.cache_size = 1000;
        !           109:   }
        !           110: }
        !           111: 
        !           112: #
        !           113: # End of tests for out-of-file-descriptors condition.
        !           114: #--------------------------------------------------------------------
        !           115: 
        !           116: sqlite3 db test.db
        !           117: execsql {
        !           118:   DELETE FROM abc;
        !           119:   INSERT INTO abc VALUES(1, 2, 3);
        !           120:   INSERT INTO abc VALUES(2, 3, 4);
        !           121:   INSERT INTO abc SELECT a+2, b, c FROM abc;
        !           122: }
        !           123:   
        !           124: 
        !           125: #--------------------------------------------------------------------
        !           126: # Test that the sqlite3_busy_timeout call seems to delay approximately
        !           127: # the right amount of time.
        !           128: #
        !           129: do_test misc7-7.0 {
        !           130:   sqlite3 db2 test.db
        !           131:   sqlite3_busy_timeout [sqlite3_connection_pointer db] 2000
        !           132:   execsql {
        !           133:     BEGIN EXCLUSIVE;
        !           134:   } db2
        !           135: 
        !           136:   # Now db2 has an exclusive lock on the database file, and db has
        !           137:   # a busy-timeout of 2000 milliseconds. So check that trying to
        !           138:   # access the database using connection db delays for at least 1500 ms.
        !           139:   #
        !           140:   set tm [time {
        !           141:     set result [catchsql {
        !           142:         SELECT * FROM sqlite_master;
        !           143:       } db]
        !           144:   }]
        !           145:   set delay [lindex $tm 0]  ;# In microseconds
        !           146:   lappend result [expr {$delay>1500000 && $delay<4000000}]
        !           147: } {1 {database is locked} 1}
        !           148: db2 close
        !           149: 
        !           150: #--------------------------------------------------------------------
        !           151: # Test that nothing goes horribly wrong when attaching a database
        !           152: # after the omit_readlock pragma has been exercised.
        !           153: #
        !           154: do_test misc7-7.1 {
        !           155:   forcedelete test2.db
        !           156:   forcedelete test2.db-journal
        !           157:   execsql {
        !           158:     PRAGMA omit_readlock = 1;
        !           159:     ATTACH 'test2.db' AS aux;
        !           160:     CREATE TABLE aux.hello(world);
        !           161:     SELECT name FROM aux.sqlite_master;
        !           162:   }
        !           163: } {hello}
        !           164: do_test misc7-7.2 {
        !           165:   execsql {
        !           166:     DETACH aux;
        !           167:   }
        !           168: } {}
        !           169: do_test misc7-7.3 {
        !           170:   db close
        !           171:   sqlite3 db test.db -readonly 1
        !           172:   execsql {
        !           173:     PRAGMA omit_readlock = 1;
        !           174:     ATTACH 'test2.db' AS aux;
        !           175:     SELECT name FROM aux.sqlite_master;
        !           176:     SELECT name FROM aux.sqlite_master;
        !           177:   }
        !           178: } {hello hello}
        !           179: do_test misc7-7.3 {
        !           180:   db close
        !           181:   sqlite3 db test.db
        !           182:   set ::DB [sqlite3_connection_pointer db]
        !           183:   list
        !           184: } {}
        !           185: 
        !           186: # Test the UTF-16 version of the "out of memory" message (used when
        !           187: # malloc fails during sqlite3_open() ).
        !           188: #
        !           189: ifcapable utf16 {
        !           190:   do_test misc7-8 {
        !           191:     encoding convertfrom unicode [sqlite3_errmsg16 0x00000000]
        !           192:   } {out of memory}
        !           193: }
        !           194: 
        !           195: do_test misc7-9 {
        !           196:   execsql {
        !           197:     SELECT * 
        !           198:     FROM (SELECT name+1 AS one FROM sqlite_master LIMIT 1 OFFSET 1) 
        !           199:     WHERE one LIKE 'hello%';
        !           200:   }
        !           201: } {}
        !           202: 
        !           203: #--------------------------------------------------------------------
        !           204: # Improve coverage for vtab code.
        !           205: #
        !           206: ifcapable vtab {
        !           207:   # Run some debug code to improve reported coverage
        !           208:   #
        !           209: 
        !           210:   # set sqlite_where_trace 1
        !           211:   do_test misc7-10 {
        !           212:     register_echo_module [sqlite3_connection_pointer db]
        !           213:     execsql {
        !           214:       CREATE VIRTUAL TABLE t1 USING echo(abc);
        !           215:       SELECT a FROM t1 WHERE a = 1 ORDER BY b;
        !           216:     }
        !           217:   } {1}
        !           218:   set sqlite_where_trace 0
        !           219: 
        !           220:   # Specify an ORDER BY clause that cannot be indexed.
        !           221:   do_test misc7-11 {
        !           222:     execsql {
        !           223:       SELECT t1.a, t2.a FROM t1, t1 AS t2 ORDER BY 2 LIMIT 1;
        !           224:     }
        !           225:   } {1 1}
        !           226: 
        !           227:   # The whole point of this is to test an error code other than
        !           228:   # SQLITE_NOMEM from the vtab xBestIndex callback.
        !           229:   #
        !           230:   do_ioerr_test misc7-12 -tclprep {
        !           231:     sqlite3 db2 test.db
        !           232:     register_echo_module [sqlite3_connection_pointer db2]
        !           233:     db2 eval {
        !           234:       CREATE TABLE abc(a PRIMARY KEY, b, c);
        !           235:       INSERT INTO abc VALUES(1, 2, 3);
        !           236:       CREATE VIRTUAL TABLE t1 USING echo(abc);
        !           237:     }
        !           238:     db2 close
        !           239:   } -tclbody {
        !           240:     register_echo_module [sqlite3_connection_pointer db]
        !           241:     execsql {SELECT * FROM t1 WHERE a = 1;}
        !           242:   } 
        !           243: 
        !           244:   # The case where the virtual table module returns a very large number
        !           245:   # as the cost of a scan (greater than SQLITE_BIG_DOUBLE in the code).
        !           246:   #
        !           247:   do_test misc7-13 {
        !           248:     sqlite3 db test.db
        !           249:     register_echo_module [sqlite3_connection_pointer db]
        !           250:     set ::echo_module_cost 2.0e+99
        !           251:     execsql {SELECT * FROM t1 WHERE a = 1;}
        !           252:   } {1 2 3}
        !           253:   unset ::echo_module_cost
        !           254: }
        !           255: 
        !           256: db close
        !           257: forcedelete test.db
        !           258: forcedelete test.db-journal
        !           259: sqlite3 db test.db
        !           260: 
        !           261: ifcapable explain {
        !           262:   do_execsql_test misc7-14.1 {
        !           263:     CREATE TABLE abc(a PRIMARY KEY, b, c);
        !           264:     EXPLAIN QUERY PLAN SELECT * FROM abc AS t2 WHERE rowid = 1;
        !           265:   } {
        !           266:     0 0 0 {SEARCH TABLE abc AS t2 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
        !           267:   }
        !           268:   do_execsql_test misc7-14.2 {
        !           269:     EXPLAIN QUERY PLAN SELECT * FROM abc AS t2 WHERE a = 1;
        !           270:   } {0 0 0 
        !           271:      {SEARCH TABLE abc AS t2 USING INDEX sqlite_autoindex_abc_1 (a=?) (~1 rows)}
        !           272:   }
        !           273:   do_execsql_test misc7-14.3 {
        !           274:     EXPLAIN QUERY PLAN SELECT * FROM abc AS t2 ORDER BY a;
        !           275:   } {0 0 0 
        !           276:      {SCAN TABLE abc AS t2 USING INDEX sqlite_autoindex_abc_1 (~1000000 rows)}
        !           277:   }
        !           278: }
        !           279: 
        !           280: db close
        !           281: forcedelete test.db
        !           282: forcedelete test.db-journal
        !           283: sqlite3 db test.db
        !           284: 
        !           285: #--------------------------------------------------------------------
        !           286: # This is all to force the pager_remove_from_stmt_list() function
        !           287: # (inside pager.c) to remove a pager from the middle of the
        !           288: # statement-list.
        !           289: #
        !           290: do_test misc7-15.1 {
        !           291:   execsql {
        !           292:     PRAGMA cache_size = 10;
        !           293:     BEGIN;
        !           294:     CREATE TABLE abc(a PRIMARY KEY, b, c);
        !           295:     INSERT INTO abc 
        !           296:     VALUES(randstr(100,100), randstr(100,100), randstr(100,100));
        !           297:     INSERT INTO abc SELECT 
        !           298:             randstr(100,100), randstr(100,100), randstr(100,100) FROM abc;
        !           299:     INSERT INTO abc SELECT 
        !           300:             randstr(100,100), randstr(100,100), randstr(100,100) FROM abc;
        !           301:     INSERT INTO abc SELECT 
        !           302:             randstr(100,100), randstr(100,100), randstr(100,100) FROM abc;
        !           303:     INSERT INTO abc SELECT 
        !           304:             randstr(100,100), randstr(100,100), randstr(100,100) FROM abc;
        !           305:     INSERT INTO abc SELECT 
        !           306:             randstr(100,100), randstr(100,100), randstr(100,100) FROM abc;
        !           307:     INSERT INTO abc SELECT 
        !           308:             randstr(100,100), randstr(100,100), randstr(100,100) FROM abc;
        !           309:     INSERT INTO abc SELECT 
        !           310:             randstr(100,100), randstr(100,100), randstr(100,100) FROM abc;
        !           311:     INSERT INTO abc SELECT 
        !           312:             randstr(100,100), randstr(100,100), randstr(100,100) FROM abc;
        !           313:     COMMIT;
        !           314:   }
        !           315:   expr {[file size test.db]>10240}
        !           316: } {1}
        !           317: do_test misc7-15.2 {
        !           318:   execsql {
        !           319:     DELETE FROM abc WHERE rowid > 12;
        !           320:     INSERT INTO abc SELECT 
        !           321:             randstr(100,100), randstr(100,100), randstr(100,100) FROM abc;
        !           322:   }
        !           323: } {}
        !           324: 
        !           325: db close
        !           326: forcedelete test.db
        !           327: forcedelete test.db-journal
        !           328: sqlite3 db test.db
        !           329: 
        !           330: do_ioerr_test misc7-16 -sqlprep {
        !           331:    PRAGMA cache_size = 10;
        !           332:    PRAGMA default_cache_size = 10;
        !           333:    CREATE TABLE t3(a, b, UNIQUE(a, b));
        !           334:    INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) );
        !           335:    INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
        !           336:    INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
        !           337:    INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
        !           338:    INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
        !           339:    INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
        !           340:    UPDATE t3 
        !           341:    SET b = 'hello world'
        !           342:    WHERE rowid >= (SELECT max(rowid)-1 FROM t3);
        !           343: } -tclbody {
        !           344:   set rc [catch {db eval {
        !           345:     BEGIN;
        !           346:       PRAGMA cache_size = 10;
        !           347:       INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) );
        !           348:       UPDATE t3 SET a = b;
        !           349:     COMMIT;
        !           350:   }} msg]
        !           351: 
        !           352:   if {!$rc || ($rc && [string first "columns" $msg]==0)} {
        !           353:     set msg
        !           354:   } else {
        !           355:     error $msg
        !           356:   }
        !           357: }
        !           358: 
        !           359: sqlite3 db test.db
        !           360: 
        !           361: do_test misc7-16.X {
        !           362:   execsql {
        !           363:     SELECT count(*) FROM t3;
        !           364:   }
        !           365: } {32}
        !           366: 
        !           367: #----------------------------------------------------------------------
        !           368: # Test the situation where a hot-journal is discovered but write-access
        !           369: # to it is denied. This should return SQLITE_BUSY.
        !           370: #
        !           371: # These tests do not work on windows due to restrictions in the
        !           372: # windows file system.
        !           373: #
        !           374: if {$tcl_platform(platform)!="windows" && $tcl_platform(platform)!="os2"} {
        !           375: 
        !           376:   # Some network filesystems (ex: AFP) do not support setting read-only
        !           377:   # permissions.  Only run these tests if full unix permission setting
        !           378:   # capabilities are supported.
        !           379:   #
        !           380:   file attributes test.db -permissions rw-r--r--
        !           381:   if {[file attributes test.db -permissions]==0644} {
        !           382: 
        !           383:     do_test misc7-17.1 {
        !           384:       execsql {
        !           385:         BEGIN;
        !           386:         DELETE FROM t3 WHERE (oid%3)==0;
        !           387:       }
        !           388:       forcecopy test.db bak.db
        !           389:       forcecopy test.db-journal bak.db-journal
        !           390:       execsql {
        !           391:         COMMIT;
        !           392:       }
        !           393:     
        !           394:       db close
        !           395:       forcecopy bak.db test.db
        !           396:       forcecopy bak.db-journal test.db-journal
        !           397:       sqlite3 db test.db
        !           398:     
        !           399:       catch {file attributes test.db-journal -permissions r--------}
        !           400:       catch {file attributes test.db-journal -readonly 1}
        !           401:       catchsql {
        !           402:         SELECT count(*) FROM t3;
        !           403:       }
        !           404:     } {1 {unable to open database file}}
        !           405:     do_test misc7-17.2 {
        !           406:       # Note that the -readonly flag must be cleared before the -permissions
        !           407:       # are set. Otherwise, when using tcl 8.5 on mac, the fact that the 
        !           408:       # -readonly flag is set causes the attempt to set the permissions
        !           409:       # to fail.
        !           410:       catch {file attributes test.db-journal -readonly 0}
        !           411:       catch {file attributes test.db-journal -permissions rw-------}
        !           412:       catchsql {
        !           413:         SELECT count(*) FROM t3;
        !           414:       }
        !           415:     } {0 32}
        !           416:     
        !           417:     # sqlite3_test_control_pending_page [expr ($::sqlite_pending_byte / 1024) + 1]
        !           418:     set ::pending_byte_page [expr ($::sqlite_pending_byte / 1024) + 1]
        !           419:     sqlite3_test_control_pending_byte $::sqlite_pending_byte 
        !           420:     do_test misc7-17.3 {
        !           421:       db eval {
        !           422:         pragma writable_schema = true;
        !           423:         UPDATE sqlite_master 
        !           424:           SET rootpage = $pending_byte_page
        !           425:           WHERE type = 'table' AND name = 't3';
        !           426:       }
        !           427:       execsql {
        !           428:         SELECT rootpage FROM sqlite_master WHERE type = 'table' AND name = 't3';
        !           429:       }
        !           430:     } $::pending_byte_page
        !           431:     
        !           432:     do_test misc7-17.4 {
        !           433:       db close
        !           434:       sqlite3 db test.db
        !           435:       catchsql {
        !           436:         SELECT count(*) FROM t3;
        !           437:       } 
        !           438:     } {1 {database disk image is malformed}}
        !           439:   }
        !           440: }
        !           441: 
        !           442: # Ticket #2470
        !           443: #
        !           444: do_test misc7-18.1 {
        !           445:   execsql {
        !           446:     CREATE TABLE table_1 (col_10);
        !           447:     CREATE TABLE table_2 (
        !           448:       col_1, col_2, col_3, col_4, col_5,
        !           449:       col_6, col_7, col_8, col_9, col_10
        !           450:     );
        !           451:     SELECT a.col_10
        !           452:     FROM
        !           453:       (SELECT table_1.col_10 AS col_10 FROM table_1) a,
        !           454:       (SELECT table_1.col_10, table_2.col_9 AS qcol_9
        !           455:          FROM table_1, table_2
        !           456:         GROUP BY table_1.col_10, qcol_9);
        !           457:   }
        !           458: } {}
        !           459: 
        !           460: # Testing boundary conditions on sqlite3_status()
        !           461: #
        !           462: do_test misc7-19.1 {
        !           463:   sqlite3_status -1 0
        !           464: } {21 0 0}
        !           465: do_test misc7-19.2 {
        !           466:   sqlite3_status 1000 0
        !           467: } {21 0 0}
        !           468: 
        !           469: 
        !           470: # sqlite3_global_recover() is a no-op.  But we might as well test it
        !           471: # if only to get the test coverage.
        !           472: #
        !           473: do_test misc7-20.1 {
        !           474:   sqlite3_global_recover
        !           475: } {SQLITE_OK}
        !           476: 
        !           477: # Try to open a really long file name.
        !           478: #
        !           479: do_test misc7-21.1 {
        !           480:   set zFile [file join [pwd] "[string repeat abcde 104].db"]
        !           481:   set rc [catch {sqlite3 db2 $zFile} msg]
        !           482:   list $rc $msg
        !           483: } {1 {unable to open database file}}
        !           484: 
        !           485: 
        !           486: db close
        !           487: forcedelete test.db
        !           488: 
        !           489: finish_test

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