Compare commits

...

1 Commits

Author SHA1 Message Date
drh 529dc02492 Add the "PRAGMA table_ipk(TABLE)" command for evaluation purposes.
FossilOrigin-Name: 2494132a2b1221a4aec9817272c088b3c6bbf9340856927457ff6de62d469676
2017-11-28 02:47:42 +00:00
6 changed files with 172 additions and 58 deletions
+12 -9
View File
@@ -1,5 +1,5 @@
C Update\stests\sto\sdeal\swith\sSQLITE_FAST_SECURE_DELETE.
D 2017-11-28T00:52:14.148
C Add\sthe\s"PRAGMA\stable_ipk(TABLE)"\scommand\sfor\sevaluation\spurposes.
D 2017-11-28T02:47:42.046
F Makefile.in 6a879cbf01e37f9eac131414955f71774b566502d9a57ded1b8585b507503cb8
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc e5d7606238f55816da99f719969598df5b091aa2e9a6935c9412fcae8f53fc44
@@ -464,8 +464,8 @@ F src/parse.y d79001da275bfe344b409006b85e81e486a0f6afc3762fdf0944f000f4aa0111
F src/pcache.c 7ae91a4557a43d77d449accbfdc68846e6516f8e2eda46e8bbe4536fb669b201
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
F src/pragma.c d04725ac25387d9638919e197fb009f378e13af7bf899516979e54b3164e3602
F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
F src/pragma.c 021613c97a331d42c45ecc1510c8ebd222972f9679254078a7e2b5c4513c4566
F src/pragma.h 4ce81be73b88094c23fc635643f8712178f986f776830ff8115627c810714b75
F src/prepare.c 7cf451f903ad92a14e22de415a13e7a7d30f1bd23b3d21eeb0dc7264723244c5
F src/printf.c 9506b4b96e59c0467047155f09015750cb2878aeda3d39e5610c1192ddc3c41c
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
@@ -975,7 +975,7 @@ F test/instrfault.test 0f870b218ea17cd477bb19ed330eecdb460dd53a
F test/intarray.test 46d95b457916638c5d8b1af21fb174804b3acf8b
F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054
F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d
F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8
F test/intpkey.test 21290ef810c049467d9f4f3b3361178ced254ff37df62af314a0ede878009b25
F test/io.test f95bca1783b01ea7761671560d023360d2dfa4cc
F test/ioerr.test 2a24bd6ed5a8b062e64bfe1f6cf94fb25e92210d
F test/ioerr2.test 2593563599e2cc6b6b4fcf5878b177bdd5d8df26
@@ -1613,7 +1613,7 @@ F tool/mkmsvcmin.tcl 8baf26690b80d861d0ac341b29880eec6ade39e4f11fe690271ded9cb90
F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c
F tool/mkopcodeh.tcl 4ee2a30ccbd900dc4d5cdb61bdab87cd2166cd2affcc78c9cc0b8d22a65b2eee
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
F tool/mkpragmatab.tcl 2144bc8550a6471a029db262a132d2df4b9e0db61b90398bf64f5b7b3f8d92cd
F tool/mkpragmatab.tcl f49ae6e8cb961d36f449109badcb7020c2fcdeb6d03c7f1acda89633e10250ca
F tool/mkshellc.tcl 574307265b49d813301fba91ccd74e6a26d33f65f74b6891c320a0ffbee07895
F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
@@ -1678,7 +1678,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 465350e55ddaf30cfba7874653301de7238a9dc2bc5e1f800fc95de9360679f6
R 5c3698b136ad7029a7e22749e9f1a061
P e6b89304695be371978e65dddd710c8bd563c66b9c94d23165142b6c235c82e1
R 89fbad1a4c6de971034ac5f140aa2b84
T *branch * pragma-table-ipk
T *sym-pragma-table-ipk *
T -sym-trunk *
U drh
Z 455c99a49ae132932748abfe00c111c4
Z 5a5f1ee8645506e803bde7a836253a0d
+1 -1
View File
@@ -1 +1 @@
e6b89304695be371978e65dddd710c8bd563c66b9c94d23165142b6c235c82e1
2494132a2b1221a4aec9817272c088b3c6bbf9340856927457ff6de62d469676
+19
View File
@@ -1117,6 +1117,25 @@ void sqlite3Pragma(
}
break;
/*
** PRAGMA table_ipk(<table>)
**
** If <table> has an INTEGER PRIMARY KEY column that is an alias for
** the ROWID, then return the name of that column. If <table> does not
** have a ROWID alias, or if it does not have a ROWID, or if <table> is
** a view or virtual table or if it does not exist, then return no rows.
*/
case PragTyp_TABLE_IPK: {
if( zRight ){
Table *pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb);
sqlite3CodeVerifySchema(pParse, iDb);
if( pTab && HasRowid(pTab) && pTab->iPKey>=0 ){
sqlite3VdbeMultiLoad(v, 1, "s", pTab->aCol[pTab->iPKey].zName);
}
}
}
break;
#ifdef SQLITE_DEBUG
case PragTyp_STATS: {
Index *pIdx;
+52 -46
View File
@@ -40,18 +40,19 @@
#define PragTyp_SOFT_HEAP_LIMIT 32
#define PragTyp_SYNCHRONOUS 33
#define PragTyp_TABLE_INFO 34
#define PragTyp_TEMP_STORE 35
#define PragTyp_TEMP_STORE_DIRECTORY 36
#define PragTyp_THREADS 37
#define PragTyp_WAL_AUTOCHECKPOINT 38
#define PragTyp_WAL_CHECKPOINT 39
#define PragTyp_ACTIVATE_EXTENSIONS 40
#define PragTyp_HEXKEY 41
#define PragTyp_KEY 42
#define PragTyp_REKEY 43
#define PragTyp_LOCK_STATUS 44
#define PragTyp_PARSER_TRACE 45
#define PragTyp_STATS 46
#define PragTyp_TABLE_IPK 35
#define PragTyp_TEMP_STORE 36
#define PragTyp_TEMP_STORE_DIRECTORY 37
#define PragTyp_THREADS 38
#define PragTyp_WAL_AUTOCHECKPOINT 39
#define PragTyp_WAL_CHECKPOINT 40
#define PragTyp_ACTIVATE_EXTENSIONS 41
#define PragTyp_HEXKEY 42
#define PragTyp_KEY 43
#define PragTyp_REKEY 44
#define PragTyp_LOCK_STATUS 45
#define PragTyp_PARSER_TRACE 46
#define PragTyp_STATS 47
/* Property flags associated with various pragma. */
#define PragFlg_NeedSchema 0x01 /* Force schema load before running */
@@ -75,31 +76,31 @@ static const char *const pragCName[] = {
/* 4 */ "notnull",
/* 5 */ "dflt_value",
/* 6 */ "pk",
/* 7 */ "tbl", /* Used by: stats */
/* 8 */ "idx",
/* 9 */ "wdth",
/* 10 */ "hght",
/* 11 */ "flgs",
/* 12 */ "seqno", /* Used by: index_info */
/* 13 */ "cid",
/* 14 */ "name",
/* 15 */ "seqno", /* Used by: index_xinfo */
/* 16 */ "cid",
/* 17 */ "name",
/* 18 */ "desc",
/* 19 */ "coll",
/* 20 */ "key",
/* 21 */ "seq", /* Used by: index_list */
/* 22 */ "name",
/* 23 */ "unique",
/* 24 */ "origin",
/* 25 */ "partial",
/* 26 */ "seq", /* Used by: database_list */
/* 27 */ "name",
/* 28 */ "file",
/* 29 */ "name", /* Used by: function_list */
/* 30 */ "builtin",
/* 31 */ "name", /* Used by: module_list pragma_list */
/* 7 */ "name", /* Used by: table_ipk module_list pragma_list */
/* 8 */ "tbl", /* Used by: stats */
/* 9 */ "idx",
/* 10 */ "wdth",
/* 11 */ "hght",
/* 12 */ "flgs",
/* 13 */ "seqno", /* Used by: index_info */
/* 14 */ "cid",
/* 15 */ "name",
/* 16 */ "seqno", /* Used by: index_xinfo */
/* 17 */ "cid",
/* 18 */ "name",
/* 19 */ "desc",
/* 20 */ "coll",
/* 21 */ "key",
/* 22 */ "seq", /* Used by: index_list */
/* 23 */ "name",
/* 24 */ "unique",
/* 25 */ "origin",
/* 26 */ "partial",
/* 27 */ "seq", /* Used by: database_list */
/* 28 */ "name",
/* 29 */ "file",
/* 30 */ "name", /* Used by: function_list */
/* 31 */ "builtin",
/* 32 */ "seq", /* Used by: collation_list */
/* 33 */ "name",
/* 34 */ "id", /* Used by: foreign_key_list */
@@ -237,7 +238,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "database_list",
/* ePragTyp: */ PragTyp_DATABASE_LIST,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0,
/* ColNames: */ 26, 3,
/* ColNames: */ 27, 3,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
@@ -317,7 +318,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "function_list",
/* ePragTyp: */ PragTyp_FUNCTION_LIST,
/* ePragFlg: */ PragFlg_Result0,
/* ColNames: */ 29, 2,
/* ColNames: */ 30, 2,
/* iArg: */ 0 },
#endif
#endif
@@ -353,17 +354,17 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "index_info",
/* ePragTyp: */ PragTyp_INDEX_INFO,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
/* ColNames: */ 12, 3,
/* ColNames: */ 13, 3,
/* iArg: */ 0 },
{/* zName: */ "index_list",
/* ePragTyp: */ PragTyp_INDEX_LIST,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
/* ColNames: */ 21, 5,
/* ColNames: */ 22, 5,
/* iArg: */ 0 },
{/* zName: */ "index_xinfo",
/* ePragTyp: */ PragTyp_INDEX_INFO,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
/* ColNames: */ 15, 6,
/* ColNames: */ 16, 6,
/* iArg: */ 1 },
#endif
#if !defined(SQLITE_OMIT_INTEGRITY_CHECK)
@@ -436,7 +437,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "module_list",
/* ePragTyp: */ PragTyp_MODULE_LIST,
/* ePragFlg: */ PragFlg_Result0,
/* ColNames: */ 31, 1,
/* ColNames: */ 7, 1,
/* iArg: */ 0 },
#endif
#endif
@@ -469,7 +470,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "pragma_list",
/* ePragTyp: */ PragTyp_PRAGMA_LIST,
/* ePragFlg: */ PragFlg_Result0,
/* ColNames: */ 31, 1,
/* ColNames: */ 7, 1,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
@@ -556,7 +557,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "stats",
/* ePragTyp: */ PragTyp_STATS,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq,
/* ColNames: */ 7, 5,
/* ColNames: */ 8, 5,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
@@ -572,6 +573,11 @@ static const PragmaName aPragmaName[] = {
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
/* ColNames: */ 1, 6,
/* iArg: */ 0 },
{/* zName: */ "table_ipk",
/* ePragTyp: */ PragTyp_TABLE_IPK,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1,
/* ColNames: */ 7, 1,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
{/* zName: */ "temp_store",
@@ -646,4 +652,4 @@ static const PragmaName aPragmaName[] = {
/* iArg: */ SQLITE_WriteSchema },
#endif
};
/* Number of pragmas: 60 on by default, 77 total. */
/* Number of pragmas: 61 on by default, 78 total. */
+83 -2
View File
@@ -1,4 +1,4 @@
# 2001 September 15
# 2001-09-15
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
@@ -13,7 +13,6 @@
# This file implements tests for the special processing associated
# with INTEGER PRIMARY KEY columns.
#
# $Id: intpkey.test,v 1.24 2007/11/29 17:43:28 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -642,4 +641,86 @@ do_execsql_test intpkey-17.2 {
SELECT * FROM t17 ORDER BY +x;
} {123 elephant 248 ostrich}
# 2017-11-28: The table_ipk pragma.
#
do_execsql_test intpkey-18.0 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER PRIMARY KEY, abc, pqr);
PRAGMA table_ipk(t1);
} {xyz}
do_execsql_test intpkey-18.1 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER PRIMARY KEY ASC, abc, pqr);
PRAGMA table_ipk(t1);
} {xyz}
do_execsql_test intpkey-18.2 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER PRIMARY KEY DESC, abc, pqr);
PRAGMA table_ipk(t1);
} {}
do_execsql_test intpkey-18.3 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER, abc, pqr, PRIMARY KEY(xyz));
PRAGMA table_ipk(t1);
} {xyz}
do_execsql_test intpkey-18.4 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER, abc, pqr, PRIMARY KEY(xyz ASC));
PRAGMA table_ipk(t1);
} {xyz}
do_execsql_test intpkey-18.5 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER, abc, pqr, PRIMARY KEY(xyz DESC));
PRAGMA table_ipk(t1);
} {xyz}
do_execsql_test intpkey-18.10 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER PRIMARY KEY, abc, pqr) WITHOUT ROWID;
PRAGMA table_ipk(t1);
} {}
do_execsql_test intpkey-18.11 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER PRIMARY KEY ASC, abc, pqr) WITHOUT ROWID;
PRAGMA table_ipk(t1);
} {}
do_execsql_test intpkey-18.12 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER PRIMARY KEY DESC, abc, pqr) WITHOUT ROWID;
PRAGMA table_ipk(t1);
} {}
do_execsql_test intpkey-18.13 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER, abc, pqr, PRIMARY KEY(xyz)) WITHOUT ROWID;
PRAGMA table_ipk(t1);
} {}
do_execsql_test intpkey-18.14 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER, abc, pqr, PRIMARY KEY(xyz ASC)) WITHOUT ROWID;
PRAGMA table_ipk(t1);
} {}
do_execsql_test intpkey-18.15 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(xyz INTEGER, abc, pqr, PRIMARY KEY(xyz DESC)) WITHOUT ROWID;
PRAGMA table_ipk(t1);
} {}
do_execsql_test intpkey-18.20 {
DROP TABLE IF EXISTS t1;
PRAGMA table_ipk(t1);
} {}
do_execsql_test intpkey-18.21 {
CREATE TABLE t1(a,b,xyz INTEGER PRIMARY KEY NOT NULL);
SELECT * FROM pragma_table_ipk('t1');
} {xyz}
do_execsql_test intpkey-18.22 {
PRAGMA table_ipk(pragma_table_ipk);
} {}
do_execsql_test intpkey-18.23 {
PRAGMA table_info(pragma_table_ipk);
} {0 name {} 0 {} 0}
do_execsql_test intpkey-18.24 {
CREATE VIEW v1 AS SELECT * FROM t1 WHERE rowid>5;
PRAGMA table_ipk(v1);
} {}
finish_test
+5
View File
@@ -223,6 +223,11 @@ set pragma_def {
COLS: cid name type notnull dflt_value pk
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
NAME: table_ipk
FLAG: NeedSchema Result1
COLS: name
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
NAME: stats
FLAG: NeedSchema Result0 SchemaReq
COLS: tbl idx wdth hght flgs