xref: /sqlite-3.40.0/test/intpkey.test (revision 8210233c)
14a32431cSdrh# 2001 September 15
24a32431cSdrh#
34a32431cSdrh# The author disclaims copyright to this source code.  In place of
44a32431cSdrh# a legal notice, here is a blessing:
54a32431cSdrh#
64a32431cSdrh#    May you do good and not evil.
74a32431cSdrh#    May you find forgiveness for yourself and forgive others.
84a32431cSdrh#    May you share freely, never taking more than you give.
94a32431cSdrh#
104a32431cSdrh#***********************************************************************
114a32431cSdrh# This file implements regression tests for SQLite library.
124a32431cSdrh#
134a32431cSdrh# This file implements tests for the special processing associated
144a32431cSdrh# with INTEGER PRIMARY KEY columns.
154a32431cSdrh#
1621de2e75Sdanielk1977# $Id: intpkey.test,v 1.24 2007/11/29 17:43:28 danielk1977 Exp $
174a32431cSdrh
184a32431cSdrhset testdir [file dirname $argv0]
194a32431cSdrhsource $testdir/tester.tcl
204a32431cSdrh
214a32431cSdrh# Create a table with a primary key and a datatype other than
224a32431cSdrh# integer
234a32431cSdrh#
244a32431cSdrhdo_test intpkey-1.0 {
254a32431cSdrh  execsql {
264a32431cSdrh    CREATE TABLE t1(a TEXT PRIMARY KEY, b, c);
274a32431cSdrh  }
284a32431cSdrh} {}
294a32431cSdrh
304a32431cSdrh# There should be an index associated with the primary key
314a32431cSdrh#
324a32431cSdrhdo_test intpkey-1.1 {
334a32431cSdrh  execsql {
344a32431cSdrh    SELECT name FROM sqlite_master
354a32431cSdrh    WHERE type='index' AND tbl_name='t1';
364a32431cSdrh  }
37d8123366Sdanielk1977} {sqlite_autoindex_t1_1}
384a32431cSdrh
394a32431cSdrh# Now create a table with an integer primary key and verify that
404a32431cSdrh# there is no associated index.
414a32431cSdrh#
424a32431cSdrhdo_test intpkey-1.2 {
434a32431cSdrh  execsql {
444a32431cSdrh    DROP TABLE t1;
454a32431cSdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
464a32431cSdrh    SELECT name FROM sqlite_master
474a32431cSdrh      WHERE type='index' AND tbl_name='t1';
484a32431cSdrh  }
494a32431cSdrh} {}
504a32431cSdrh
514a32431cSdrh# Insert some records into the new table.  Specify the primary key
524a32431cSdrh# and verify that the key is used as the record number.
534a32431cSdrh#
544a32431cSdrhdo_test intpkey-1.3 {
554a32431cSdrh  execsql {
564a32431cSdrh    INSERT INTO t1 VALUES(5,'hello','world');
574a32431cSdrh  }
58af9ff33aSdrh  db last_insert_rowid
59af9ff33aSdrh} {5}
604a32431cSdrhdo_test intpkey-1.4 {
614a32431cSdrh  execsql {
624a32431cSdrh    SELECT * FROM t1;
634a32431cSdrh  }
644a32431cSdrh} {5 hello world}
654a32431cSdrhdo_test intpkey-1.5 {
664a32431cSdrh  execsql {
674a32431cSdrh    SELECT rowid, * FROM t1;
684a32431cSdrh  }
694a32431cSdrh} {5 5 hello world}
704a32431cSdrh
714a32431cSdrh# Attempting to insert a duplicate primary key should give a constraint
724a32431cSdrh# failure.
734a32431cSdrh#
744a32431cSdrhdo_test intpkey-1.6 {
754a32431cSdrh  set r [catch {execsql {
764a32431cSdrh     INSERT INTO t1 VALUES(5,'second','entry');
774a32431cSdrh  }} msg]
784a32431cSdrh  lappend r $msg
79f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t1.a}}
804a32431cSdrhdo_test intpkey-1.7 {
814a32431cSdrh  execsql {
824a32431cSdrh    SELECT rowid, * FROM t1;
834a32431cSdrh  }
844a32431cSdrh} {5 5 hello world}
854a32431cSdrhdo_test intpkey-1.8 {
864a32431cSdrh  set r [catch {execsql {
874a32431cSdrh     INSERT INTO t1 VALUES(6,'second','entry');
884a32431cSdrh  }} msg]
894a32431cSdrh  lappend r $msg
904a32431cSdrh} {0 {}}
91af9ff33aSdrhdo_test intpkey-1.8.1 {
92af9ff33aSdrh  db last_insert_rowid
93af9ff33aSdrh} {6}
944a32431cSdrhdo_test intpkey-1.9 {
954a32431cSdrh  execsql {
964a32431cSdrh    SELECT rowid, * FROM t1;
974a32431cSdrh  }
984a32431cSdrh} {5 5 hello world 6 6 second entry}
994a32431cSdrh
1004a32431cSdrh# A ROWID is automatically generated for new records that do not specify
1014a32431cSdrh# the integer primary key.
1024a32431cSdrh#
1034a32431cSdrhdo_test intpkey-1.10 {
1044a32431cSdrh  execsql {
1054a32431cSdrh    INSERT INTO t1(b,c) VALUES('one','two');
1064a32431cSdrh    SELECT b FROM t1 ORDER BY b;
1074a32431cSdrh  }
1084a32431cSdrh} {hello one second}
1094a32431cSdrh
1104a32431cSdrh# Try to change the ROWID for the new entry.
1114a32431cSdrh#
1124a32431cSdrhdo_test intpkey-1.11 {
1134a32431cSdrh  execsql {
1145cf8e8c7Sdrh    UPDATE t1 SET a=4 WHERE b='one';
1154a32431cSdrh    SELECT * FROM t1;
1164a32431cSdrh  }
1175cf8e8c7Sdrh} {4 one two 5 hello world 6 second entry}
1184a32431cSdrh
1194a32431cSdrh# Make sure SELECT statements are able to use the primary key column
1204a32431cSdrh# as an index.
1214a32431cSdrh#
1227ec764a2Sdrhdo_test intpkey-1.12.1 {
1234a32431cSdrh  execsql {
1245cf8e8c7Sdrh    SELECT * FROM t1 WHERE a==4;
1254a32431cSdrh  }
1265cf8e8c7Sdrh} {4 one two}
1277ec764a2Sdrhdo_test intpkey-1.12.2 {
1287c171098Sdrh  execsql {
1297c171098Sdrh    EXPLAIN QUERY PLAN
1307c171098Sdrh    SELECT * FROM t1 WHERE a==4;
1317c171098Sdrh  }
132*8210233cSdrh} {/SEARCH t1 /}
1334a32431cSdrh
1348aff1015Sdrh# Try to insert a non-integer value into the primary key field.  This
1358aff1015Sdrh# should result in a data type mismatch.
1368aff1015Sdrh#
1379468c7f4Sdrhdo_test intpkey-1.13.1 {
1388aff1015Sdrh  set r [catch {execsql {
1398aff1015Sdrh    INSERT INTO t1 VALUES('x','y','z');
1408aff1015Sdrh  }} msg]
1418aff1015Sdrh  lappend r $msg
1428aff1015Sdrh} {1 {datatype mismatch}}
1439468c7f4Sdrhdo_test intpkey-1.13.2 {
1449468c7f4Sdrh  set r [catch {execsql {
1459468c7f4Sdrh    INSERT INTO t1 VALUES('','y','z');
1469468c7f4Sdrh  }} msg]
1479468c7f4Sdrh  lappend r $msg
1489468c7f4Sdrh} {1 {datatype mismatch}}
1498aff1015Sdrhdo_test intpkey-1.14 {
1508aff1015Sdrh  set r [catch {execsql {
1518aff1015Sdrh    INSERT INTO t1 VALUES(3.4,'y','z');
1528aff1015Sdrh  }} msg]
1538aff1015Sdrh  lappend r $msg
1548aff1015Sdrh} {1 {datatype mismatch}}
1558aff1015Sdrhdo_test intpkey-1.15 {
1568aff1015Sdrh  set r [catch {execsql {
1578aff1015Sdrh    INSERT INTO t1 VALUES(-3,'y','z');
1588aff1015Sdrh  }} msg]
1598aff1015Sdrh  lappend r $msg
1608aff1015Sdrh} {0 {}}
1618aff1015Sdrhdo_test intpkey-1.16 {
1628aff1015Sdrh  execsql {SELECT * FROM t1}
1635cf8e8c7Sdrh} {-3 y z 4 one two 5 hello world 6 second entry}
1648aff1015Sdrh
1658aff1015Sdrh#### INDICES
1668aff1015Sdrh# Check to make sure indices work correctly with integer primary keys
1678aff1015Sdrh#
1688aff1015Sdrhdo_test intpkey-2.1 {
1698aff1015Sdrh  execsql {
1708aff1015Sdrh    CREATE INDEX i1 ON t1(b);
1718aff1015Sdrh    SELECT * FROM t1 WHERE b=='y'
1728aff1015Sdrh  }
1738aff1015Sdrh} {-3 y z}
1748aff1015Sdrhdo_test intpkey-2.1.1 {
1758aff1015Sdrh  execsql {
1768aff1015Sdrh    SELECT * FROM t1 WHERE b=='y' AND rowid<0
1778aff1015Sdrh  }
1788aff1015Sdrh} {-3 y z}
1798aff1015Sdrhdo_test intpkey-2.1.2 {
1808aff1015Sdrh  execsql {
1818aff1015Sdrh    SELECT * FROM t1 WHERE b=='y' AND rowid<0 AND rowid>=-20
1828aff1015Sdrh  }
1838aff1015Sdrh} {-3 y z}
1848aff1015Sdrhdo_test intpkey-2.1.3 {
1858aff1015Sdrh  execsql {
1868aff1015Sdrh    SELECT * FROM t1 WHERE b>='y'
1878aff1015Sdrh  }
1888aff1015Sdrh} {-3 y z}
1898aff1015Sdrhdo_test intpkey-2.1.4 {
1908aff1015Sdrh  execsql {
1918aff1015Sdrh    SELECT * FROM t1 WHERE b>='y' AND rowid<10
1928aff1015Sdrh  }
1938aff1015Sdrh} {-3 y z}
1940ca3e24bSdrh
1958aff1015Sdrhdo_test intpkey-2.2 {
1968aff1015Sdrh  execsql {
1978aff1015Sdrh    UPDATE t1 SET a=8 WHERE b=='y';
1988aff1015Sdrh    SELECT * FROM t1 WHERE b=='y';
1998aff1015Sdrh  }
2008aff1015Sdrh} {8 y z}
2018aff1015Sdrhdo_test intpkey-2.3 {
2028aff1015Sdrh  execsql {
2038aff1015Sdrh    SELECT rowid, * FROM t1;
2048aff1015Sdrh  }
2055cf8e8c7Sdrh} {4 4 one two 5 5 hello world 6 6 second entry 8 8 y z}
2068aff1015Sdrhdo_test intpkey-2.4 {
2078aff1015Sdrh  execsql {
2088aff1015Sdrh    SELECT rowid, * FROM t1 WHERE b<'second'
2098aff1015Sdrh  }
2105cf8e8c7Sdrh} {5 5 hello world 4 4 one two}
2118aff1015Sdrhdo_test intpkey-2.4.1 {
2128aff1015Sdrh  execsql {
2138aff1015Sdrh    SELECT rowid, * FROM t1 WHERE 'second'>b
2148aff1015Sdrh  }
2155cf8e8c7Sdrh} {5 5 hello world 4 4 one two}
2168aff1015Sdrhdo_test intpkey-2.4.2 {
2178aff1015Sdrh  execsql {
2188aff1015Sdrh    SELECT rowid, * FROM t1 WHERE 8>rowid AND 'second'>b
2198aff1015Sdrh  }
2205cf8e8c7Sdrh} {4 4 one two 5 5 hello world}
2218aff1015Sdrhdo_test intpkey-2.4.3 {
2228aff1015Sdrh  execsql {
2238aff1015Sdrh    SELECT rowid, * FROM t1 WHERE 8>rowid AND 'second'>b AND 0<rowid
2248aff1015Sdrh  }
2255cf8e8c7Sdrh} {4 4 one two 5 5 hello world}
2268aff1015Sdrhdo_test intpkey-2.5 {
2278aff1015Sdrh  execsql {
2288aff1015Sdrh    SELECT rowid, * FROM t1 WHERE b>'a'
2298aff1015Sdrh  }
2305cf8e8c7Sdrh} {5 5 hello world 4 4 one two 6 6 second entry 8 8 y z}
2318aff1015Sdrhdo_test intpkey-2.6 {
2328aff1015Sdrh  execsql {
2335cf8e8c7Sdrh    DELETE FROM t1 WHERE rowid=4;
2348aff1015Sdrh    SELECT * FROM t1 WHERE b>'a';
2358aff1015Sdrh  }
2368aff1015Sdrh} {5 hello world 6 second entry 8 y z}
2378aff1015Sdrhdo_test intpkey-2.7 {
2388aff1015Sdrh  execsql {
2398aff1015Sdrh    UPDATE t1 SET a=-4 WHERE rowid=8;
2408aff1015Sdrh    SELECT * FROM t1 WHERE b>'a';
2418aff1015Sdrh  }
2428aff1015Sdrh} {5 hello world 6 second entry -4 y z}
2438aff1015Sdrhdo_test intpkey-2.7 {
2448aff1015Sdrh  execsql {
2458aff1015Sdrh    SELECT * FROM t1
2468aff1015Sdrh  }
2478aff1015Sdrh} {-4 y z 5 hello world 6 second entry}
2488aff1015Sdrh
2498aff1015Sdrh# Do an SQL statement.  Append the search count to the end of the result.
2508aff1015Sdrh#
2518aff1015Sdrhproc count sql {
2528aff1015Sdrh  set ::sqlite_search_count 0
2538aff1015Sdrh  return [concat [execsql $sql] $::sqlite_search_count]
2548aff1015Sdrh}
2558aff1015Sdrh
2568aff1015Sdrh# Create indices that include the integer primary key as one of their
2578aff1015Sdrh# columns.
2588aff1015Sdrh#
2598aff1015Sdrhdo_test intpkey-3.1 {
2608aff1015Sdrh  execsql {
2618aff1015Sdrh    CREATE INDEX i2 ON t1(a);
2628aff1015Sdrh  }
2638aff1015Sdrh} {}
2648aff1015Sdrhdo_test intpkey-3.2 {
2658aff1015Sdrh  count {
2668aff1015Sdrh    SELECT * FROM t1 WHERE a=5;
2678aff1015Sdrh  }
2688aff1015Sdrh} {5 hello world 0}
2698aff1015Sdrhdo_test intpkey-3.3 {
2708aff1015Sdrh  count {
2718aff1015Sdrh    SELECT * FROM t1 WHERE a>4 AND a<6;
2728aff1015Sdrh  }
2738aff1015Sdrh} {5 hello world 2}
2748aff1015Sdrhdo_test intpkey-3.4 {
2758aff1015Sdrh  count {
2768aff1015Sdrh    SELECT * FROM t1 WHERE b>='hello' AND b<'hello2';
2778aff1015Sdrh  }
2788aff1015Sdrh} {5 hello world 3}
2798aff1015Sdrhdo_test intpkey-3.5 {
2808aff1015Sdrh  execsql {
2818aff1015Sdrh    CREATE INDEX i3 ON t1(c,a);
2828aff1015Sdrh  }
2838aff1015Sdrh} {}
2848aff1015Sdrhdo_test intpkey-3.6 {
2858aff1015Sdrh  count {
2868aff1015Sdrh    SELECT * FROM t1 WHERE c=='world';
2878aff1015Sdrh  }
2888aff1015Sdrh} {5 hello world 3}
2898aff1015Sdrhdo_test intpkey-3.7 {
2908aff1015Sdrh  execsql {INSERT INTO t1 VALUES(11,'hello','world')}
2918aff1015Sdrh  count {
2928aff1015Sdrh    SELECT * FROM t1 WHERE c=='world';
2938aff1015Sdrh  }
2948aff1015Sdrh} {5 hello world 11 hello world 5}
2958aff1015Sdrhdo_test intpkey-3.8 {
2968aff1015Sdrh  count {
2978aff1015Sdrh    SELECT * FROM t1 WHERE c=='world' AND a>7;
2988aff1015Sdrh  }
299892ffcc7Sdrh} {11 hello world 3}
3008aff1015Sdrhdo_test intpkey-3.9 {
3018aff1015Sdrh  count {
3028aff1015Sdrh    SELECT * FROM t1 WHERE 7<a;
3038aff1015Sdrh  }
3048aff1015Sdrh} {11 hello world 1}
3058aff1015Sdrh
3068aff1015Sdrh# Test inequality constraints on integer primary keys and rowids
3078aff1015Sdrh#
3088aff1015Sdrhdo_test intpkey-4.1 {
3098aff1015Sdrh  count {
3108aff1015Sdrh    SELECT * FROM t1 WHERE 11=rowid
3118aff1015Sdrh  }
3128aff1015Sdrh} {11 hello world 0}
3138aff1015Sdrhdo_test intpkey-4.2 {
3148aff1015Sdrh  count {
3158aff1015Sdrh    SELECT * FROM t1 WHERE 11=rowid AND b=='hello'
3168aff1015Sdrh  }
3178aff1015Sdrh} {11 hello world 0}
3188aff1015Sdrhdo_test intpkey-4.3 {
3198aff1015Sdrh  count {
3208aff1015Sdrh    SELECT * FROM t1 WHERE 11=rowid AND b=='hello' AND c IS NOT NULL;
3218aff1015Sdrh  }
3228aff1015Sdrh} {11 hello world 0}
3238aff1015Sdrhdo_test intpkey-4.4 {
3248aff1015Sdrh  count {
3258aff1015Sdrh    SELECT * FROM t1 WHERE rowid==11
3268aff1015Sdrh  }
3278aff1015Sdrh} {11 hello world 0}
3288aff1015Sdrhdo_test intpkey-4.5 {
3298aff1015Sdrh  count {
3308aff1015Sdrh    SELECT * FROM t1 WHERE oid==11 AND b=='hello'
3318aff1015Sdrh  }
3328aff1015Sdrh} {11 hello world 0}
3338aff1015Sdrhdo_test intpkey-4.6 {
3348aff1015Sdrh  count {
3358aff1015Sdrh    SELECT * FROM t1 WHERE a==11 AND b=='hello' AND c IS NOT NULL;
3368aff1015Sdrh  }
3378aff1015Sdrh} {11 hello world 0}
3388aff1015Sdrh
3398aff1015Sdrhdo_test intpkey-4.7 {
3408aff1015Sdrh  count {
3418aff1015Sdrh    SELECT * FROM t1 WHERE 8<rowid;
3428aff1015Sdrh  }
3438aff1015Sdrh} {11 hello world 1}
3448aff1015Sdrhdo_test intpkey-4.8 {
3458aff1015Sdrh  count {
3468aff1015Sdrh    SELECT * FROM t1 WHERE 8<rowid AND 11>=oid;
3478aff1015Sdrh  }
3488aff1015Sdrh} {11 hello world 1}
3498aff1015Sdrhdo_test intpkey-4.9 {
3508aff1015Sdrh  count {
3518aff1015Sdrh    SELECT * FROM t1 WHERE 11<=_rowid_ AND 12>=a;
3528aff1015Sdrh  }
3538aff1015Sdrh} {11 hello world 1}
3548aff1015Sdrhdo_test intpkey-4.10 {
3558aff1015Sdrh  count {
3568aff1015Sdrh    SELECT * FROM t1 WHERE 0>=_rowid_;
3578aff1015Sdrh  }
3588aff1015Sdrh} {-4 y z 1}
3598aff1015Sdrhdo_test intpkey-4.11 {
3608aff1015Sdrh  count {
3618aff1015Sdrh    SELECT * FROM t1 WHERE a<0;
3628aff1015Sdrh  }
3638aff1015Sdrh} {-4 y z 1}
3648aff1015Sdrhdo_test intpkey-4.12 {
3658aff1015Sdrh  count {
3668aff1015Sdrh    SELECT * FROM t1 WHERE a<0 AND a>10;
3678aff1015Sdrh  }
3688aff1015Sdrh} {1}
3698aff1015Sdrh
3708aff1015Sdrh# Make sure it is OK to insert a rowid of 0
3718aff1015Sdrh#
3728aff1015Sdrhdo_test intpkey-5.1 {
3738aff1015Sdrh  execsql {
3748aff1015Sdrh    INSERT INTO t1 VALUES(0,'zero','entry');
3758aff1015Sdrh  }
3768aff1015Sdrh  count {
3778aff1015Sdrh    SELECT * FROM t1 WHERE a=0;
3788aff1015Sdrh  }
3798aff1015Sdrh} {0 zero entry 0}
380b45bb9f1Sdrhdo_test intpkey-5.2 {
3818aff1015Sdrh  execsql {
3823f4d1d1bSdrh    SELECT rowid, a FROM t1 ORDER BY rowid
3838aff1015Sdrh  }
3848aff1015Sdrh} {-4 -4 0 0 5 5 6 6 11 11}
3858aff1015Sdrh
386e7ec2201Sdrh# Test the ability of the COPY command to put data into a
387e7ec2201Sdrh# table that contains an integer primary key.
388e7ec2201Sdrh#
3895f3b4ab5Sdrh# COPY command has been removed.  But we retain these tests so
3905f3b4ab5Sdrh# that the tables will contain the right data for tests that follow.
3915f3b4ab5Sdrh#
392e7ec2201Sdrhdo_test intpkey-6.1 {
393e7ec2201Sdrh  execsql {
3945f3b4ab5Sdrh    BEGIN;
3955f3b4ab5Sdrh    INSERT INTO t1 VALUES(20,'b-20','c-20');
3965f3b4ab5Sdrh    INSERT INTO t1 VALUES(21,'b-21','c-21');
3975f3b4ab5Sdrh    INSERT INTO t1 VALUES(22,'b-22','c-22');
3985f3b4ab5Sdrh    COMMIT;
399e7ec2201Sdrh    SELECT * FROM t1 WHERE a>=20;
400e7ec2201Sdrh  }
401e7ec2201Sdrh} {20 b-20 c-20 21 b-21 c-21 22 b-22 c-22}
402e7ec2201Sdrhdo_test intpkey-6.2 {
403e7ec2201Sdrh  execsql {
404e7ec2201Sdrh    SELECT * FROM t1 WHERE b=='hello'
405e7ec2201Sdrh  }
406e7ec2201Sdrh} {5 hello world 11 hello world}
407e7ec2201Sdrhdo_test intpkey-6.3 {
408e7ec2201Sdrh  execsql {
409e7ec2201Sdrh    DELETE FROM t1 WHERE b='b-21';
410e7ec2201Sdrh    SELECT * FROM t1 WHERE b=='b-21';
411e7ec2201Sdrh  }
412e7ec2201Sdrh} {}
413e7ec2201Sdrhdo_test intpkey-6.4 {
414e7ec2201Sdrh  execsql {
415e7ec2201Sdrh    SELECT * FROM t1 WHERE a>=20
416e7ec2201Sdrh  }
417e7ec2201Sdrh} {20 b-20 c-20 22 b-22 c-22}
418e7ec2201Sdrh
419e7ec2201Sdrh# Do an insert of values with the columns specified out of order.
420e7ec2201Sdrh#
421e7ec2201Sdrhdo_test intpkey-7.1 {
422e7ec2201Sdrh  execsql {
423e7ec2201Sdrh    INSERT INTO t1(c,b,a) VALUES('row','new',30);
424e7ec2201Sdrh    SELECT * FROM t1 WHERE rowid>=30;
425e7ec2201Sdrh  }
426e7ec2201Sdrh} {30 new row}
4279aa028daSdrhdo_test intpkey-7.2 {
4289aa028daSdrh  execsql {
4299aa028daSdrh    SELECT * FROM t1 WHERE rowid>20;
4309aa028daSdrh  }
4319aa028daSdrh} {22 b-22 c-22 30 new row}
4324a32431cSdrh
4339647ff85Sdrh# Do an insert from a select statement.
4349647ff85Sdrh#
4359647ff85Sdrhdo_test intpkey-8.1 {
4369647ff85Sdrh  execsql {
4379647ff85Sdrh    CREATE TABLE t2(x INTEGER PRIMARY KEY, y, z);
4389647ff85Sdrh    INSERT INTO t2 SELECT * FROM t1;
4399647ff85Sdrh    SELECT rowid FROM t2;
4409647ff85Sdrh  }
4419647ff85Sdrh} {-4 0 5 6 11 20 22 30}
4429647ff85Sdrhdo_test intpkey-8.2 {
4439647ff85Sdrh  execsql {
4449647ff85Sdrh    SELECT x FROM t2;
4459647ff85Sdrh  }
4469647ff85Sdrh} {-4 0 5 6 11 20 22 30}
4479647ff85Sdrh
4489647ff85Sdrhdo_test intpkey-9.1 {
4499647ff85Sdrh  execsql {
4509647ff85Sdrh    UPDATE t1 SET c='www' WHERE c='world';
4519647ff85Sdrh    SELECT rowid, a, c FROM t1 WHERE c=='www';
4529647ff85Sdrh  }
4539647ff85Sdrh} {5 5 www 11 11 www}
4549647ff85Sdrh
455e1e68f49Sdrh
456e1e68f49Sdrh# Check insert of NULL for primary key
457e1e68f49Sdrh#
458e1e68f49Sdrhdo_test intpkey-10.1 {
459e1e68f49Sdrh  execsql {
460e1e68f49Sdrh    DROP TABLE t2;
461e1e68f49Sdrh    CREATE TABLE t2(x INTEGER PRIMARY KEY, y, z);
462e1e68f49Sdrh    INSERT INTO t2 VALUES(NULL, 1, 2);
463e1e68f49Sdrh    SELECT * from t2;
464e1e68f49Sdrh  }
465e1e68f49Sdrh} {1 1 2}
466e1e68f49Sdrhdo_test intpkey-10.2 {
467e1e68f49Sdrh  execsql {
468e1e68f49Sdrh    INSERT INTO t2 VALUES(NULL, 2, 3);
469e1e68f49Sdrh    SELECT * from t2 WHERE x=2;
470e1e68f49Sdrh  }
471e1e68f49Sdrh} {2 2 3}
47227a32783Sdrhdo_test intpkey-10.3 {
47327a32783Sdrh  execsql {
47427a32783Sdrh    INSERT INTO t2 SELECT NULL, z, y FROM t2;
47527a32783Sdrh    SELECT * FROM t2;
47627a32783Sdrh  }
47727a32783Sdrh} {1 1 2 2 2 3 3 2 1 4 3 2}
478e1e68f49Sdrh
4793d037a91Sdrh# This tests checks to see if a floating point number can be used
4803d037a91Sdrh# to reference an integer primary key.
4813d037a91Sdrh#
4823d037a91Sdrhdo_test intpkey-11.1 {
4833d037a91Sdrh  execsql {
4843d037a91Sdrh    SELECT b FROM t1 WHERE a=2.0+3.0;
4853d037a91Sdrh  }
4863d037a91Sdrh} {hello}
4873d037a91Sdrhdo_test intpkey-11.1 {
4883d037a91Sdrh  execsql {
4893d037a91Sdrh    SELECT b FROM t1 WHERE a=2.0+3.5;
4903d037a91Sdrh  }
4913d037a91Sdrh} {}
4923d037a91Sdrh
493ed717fe3Sdrhintegrity_check intpkey-12.1
494ed717fe3Sdrh
49554bbdf4fSdrh# Try to use a string that looks like a floating point number as
49654bbdf4fSdrh# an integer primary key.  This should actually work when the floating
49754bbdf4fSdrh# point value can be rounded to an integer without loss of data.
49854bbdf4fSdrh#
49954bbdf4fSdrhdo_test intpkey-13.1 {
50054bbdf4fSdrh  execsql {
50154bbdf4fSdrh    SELECT * FROM t1 WHERE a=1;
50254bbdf4fSdrh  }
50354bbdf4fSdrh} {}
50454bbdf4fSdrhdo_test intpkey-13.2 {
50554bbdf4fSdrh  execsql {
50654bbdf4fSdrh    INSERT INTO t1 VALUES('1.0',2,3);
50754bbdf4fSdrh    SELECT * FROM t1 WHERE a=1;
50854bbdf4fSdrh  }
50954bbdf4fSdrh} {1 2 3}
51054bbdf4fSdrhdo_test intpkey-13.3 {
51154bbdf4fSdrh  catchsql {
51254bbdf4fSdrh    INSERT INTO t1 VALUES('1.5',3,4);
51354bbdf4fSdrh  }
51454bbdf4fSdrh} {1 {datatype mismatch}}
515a71aa001Sdrhifcapable {bloblit} {
51654bbdf4fSdrh  do_test intpkey-13.4 {
51754bbdf4fSdrh    catchsql {
51854bbdf4fSdrh      INSERT INTO t1 VALUES(x'123456',3,4);
51954bbdf4fSdrh    }
52054bbdf4fSdrh  } {1 {datatype mismatch}}
521a71aa001Sdrh}
5229d213ef0Sdrhdo_test intpkey-13.5 {
5239d213ef0Sdrh  catchsql {
5249d213ef0Sdrh    INSERT INTO t1 VALUES('+1234567890',3,4);
5259d213ef0Sdrh  }
5269d213ef0Sdrh} {0 {}}
52754bbdf4fSdrh
5283fdf8266Sdanielk1977# Compare an INTEGER PRIMARY KEY against a TEXT expression. The INTEGER
5293fdf8266Sdanielk1977# affinity should be applied to the text value before the comparison
5303fdf8266Sdanielk1977# takes place.
5313fdf8266Sdanielk1977#
5323fdf8266Sdanielk1977do_test intpkey-14.1 {
5333fdf8266Sdanielk1977  execsql {
5343fdf8266Sdanielk1977    CREATE TABLE t3(a INTEGER PRIMARY KEY, b INTEGER, c TEXT);
5353fdf8266Sdanielk1977    INSERT INTO t3 VALUES(1, 1, 'one');
5363fdf8266Sdanielk1977    INSERT INTO t3 VALUES(2, 2, '2');
5373fdf8266Sdanielk1977    INSERT INTO t3 VALUES(3, 3, 3);
5383fdf8266Sdanielk1977  }
5393fdf8266Sdanielk1977} {}
5403fdf8266Sdanielk1977do_test intpkey-14.2 {
5413fdf8266Sdanielk1977  execsql {
5423fdf8266Sdanielk1977    SELECT * FROM t3 WHERE a>2;
5433fdf8266Sdanielk1977  }
5443fdf8266Sdanielk1977} {3 3 3}
5453fdf8266Sdanielk1977do_test intpkey-14.3 {
5463fdf8266Sdanielk1977  execsql {
5473fdf8266Sdanielk1977    SELECT * FROM t3 WHERE a>'2';
5483fdf8266Sdanielk1977  }
5493fdf8266Sdanielk1977} {3 3 3}
5503fdf8266Sdanielk1977do_test intpkey-14.4 {
5513fdf8266Sdanielk1977  execsql {
5523fdf8266Sdanielk1977    SELECT * FROM t3 WHERE a<'2';
5533fdf8266Sdanielk1977  }
5543fdf8266Sdanielk1977} {1 1 one}
5553fdf8266Sdanielk1977do_test intpkey-14.5 {
5563fdf8266Sdanielk1977  execsql {
5573fdf8266Sdanielk1977    SELECT * FROM t3 WHERE a<c;
5583fdf8266Sdanielk1977  }
5593fdf8266Sdanielk1977} {1 1 one}
5603fdf8266Sdanielk1977do_test intpkey-14.6 {
5613fdf8266Sdanielk1977  execsql {
5623fdf8266Sdanielk1977    SELECT * FROM t3 WHERE a=c;
5633fdf8266Sdanielk1977  }
5643fdf8266Sdanielk1977} {2 2 2 3 3 3}
56554bbdf4fSdrh
566f4f8fd51Sdrh# Check for proper handling of primary keys greater than 2^31.
567f4f8fd51Sdrh# Ticket #1188
568f4f8fd51Sdrh#
569f4f8fd51Sdrhdo_test intpkey-15.1 {
570f4f8fd51Sdrh  execsql {
571f4f8fd51Sdrh    INSERT INTO t1 VALUES(2147483647, 'big-1', 123);
572f4f8fd51Sdrh    SELECT * FROM t1 WHERE a>2147483648;
573f4f8fd51Sdrh  }
574f4f8fd51Sdrh} {}
575f4f8fd51Sdrhdo_test intpkey-15.2 {
576f4f8fd51Sdrh  execsql {
577f4f8fd51Sdrh    INSERT INTO t1 VALUES(NULL, 'big-2', 234);
578f4f8fd51Sdrh    SELECT b FROM t1 WHERE a>=2147483648;
579f4f8fd51Sdrh  }
580f4f8fd51Sdrh} {big-2}
581f4f8fd51Sdrhdo_test intpkey-15.3 {
582f4f8fd51Sdrh  execsql {
583f4f8fd51Sdrh    SELECT b FROM t1 WHERE a>2147483648;
584f4f8fd51Sdrh  }
585f4f8fd51Sdrh} {}
586f4f8fd51Sdrhdo_test intpkey-15.4 {
587f4f8fd51Sdrh  execsql {
588f4f8fd51Sdrh    SELECT b FROM t1 WHERE a>=2147483647;
589f4f8fd51Sdrh  }
590f4f8fd51Sdrh} {big-1 big-2}
591f4f8fd51Sdrhdo_test intpkey-15.5 {
592f4f8fd51Sdrh  execsql {
593f4f8fd51Sdrh    SELECT b FROM t1 WHERE a<2147483648;
594f4f8fd51Sdrh  }
595f4f8fd51Sdrh} {y zero 2 hello second hello b-20 b-22 new 3 big-1}
596f4f8fd51Sdrhdo_test intpkey-15.6 {
597f4f8fd51Sdrh  execsql {
598f4f8fd51Sdrh    SELECT b FROM t1 WHERE a<12345678901;
599f4f8fd51Sdrh  }
600f4f8fd51Sdrh} {y zero 2 hello second hello b-20 b-22 new 3 big-1 big-2}
601f4f8fd51Sdrhdo_test intpkey-15.7 {
602f4f8fd51Sdrh  execsql {
603f4f8fd51Sdrh    SELECT b FROM t1 WHERE a>12345678901;
604f4f8fd51Sdrh  }
605f4f8fd51Sdrh} {}
6063fdf8266Sdanielk1977
607a6dddd9bSdrh# 2016-04-18 ticket https://www.sqlite.org/src/tktview/7d7525cb01b68712495d3a
608a6dddd9bSdrh# Be sure to escape quoted typenames.
609a6dddd9bSdrh#
610a6dddd9bSdrhdo_execsql_test intpkey-16.0 {
611a6dddd9bSdrh  CREATE TABLE t16a(id "INTEGER" PRIMARY KEY AUTOINCREMENT, b [TEXT], c `INT`);
612a6dddd9bSdrh} {}
613a6dddd9bSdrhdo_execsql_test intpkey-16.1 {
614a6dddd9bSdrh  PRAGMA table_info=t16a;
615a6dddd9bSdrh} {0 id INTEGER 0 {} 1 1 b TEXT 0 {} 0 2 c INT 0 {} 0}
616a6dddd9bSdrh
61770077d17Sdrh# 2016-05-06 ticket https://www.sqlite.org/src/tktview/16c9801ceba4923939085
61870077d17Sdrh# When the schema contains an index on the IPK and no other index
61970077d17Sdrh# and a WHERE clause on a delete uses an OR where both sides referencing
62070077d17Sdrh# the IPK, then it is possible that the OP_Delete will fail because there
62170077d17Sdrh# deferred seek of the OP_Seek is not resolved prior to reaching the OP_Delete.
62270077d17Sdrh#
62370077d17Sdrhdo_execsql_test intpkey-17.0 {
62470077d17Sdrh  CREATE TABLE t17(x INTEGER PRIMARY KEY, y TEXT);
62570077d17Sdrh  INSERT INTO t17(x,y) VALUES(123,'elephant'),(248,'giraffe');
62670077d17Sdrh  CREATE INDEX t17x ON t17(x);
62770077d17Sdrh  DELETE FROM t17 WHERE x=99 OR x<130;
62870077d17Sdrh  SELECT * FROM t17;
62970077d17Sdrh} {248 giraffe}
630bcf6884aSdrhdo_execsql_test intpkey-17.1 {
631bcf6884aSdrh  DROP INDEX t17x;
632bcf6884aSdrh  DELETE FROM t17;
633bcf6884aSdrh  INSERT INTO t17(x,y) VALUES(123,'elephant'),(248,'giraffe');
634f09c4823Sdrh  CREATE UNIQUE INDEX t17x ON t17(abs(x));
635bcf6884aSdrh  DELETE FROM t17 WHERE abs(x) IS NULL OR abs(x)<130;
636bcf6884aSdrh  SELECT * FROM t17;
637bcf6884aSdrh} {248 giraffe}
638f09c4823Sdrhdo_execsql_test intpkey-17.2 {
639f09c4823Sdrh  DELETE FROM t17;
640f09c4823Sdrh  INSERT INTO t17(x,y) VALUES(123,'elephant'),(248,'giraffe');
6413eead270Sdrh  UPDATE t17 SET y='ostrich' WHERE abs(x)=248;
642f09c4823Sdrh  SELECT * FROM t17 ORDER BY +x;
643f09c4823Sdrh} {123 elephant 248 ostrich}
644f4f8fd51Sdrh
645f4f8fd51Sdrhfinish_test
646