1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Add a "pk" column to the table_info pragma which is true for each column

that is part of the primary key.  Add a "foreign_key_list" pragma that gives
information about all foreign keys for a table.  Both changes are experimental. (CVS 1081)

FossilOrigin-Name: 5232b0665b84a9339a85918570093a376a0ea91f
This commit is contained in:
drh
2003-08-23 22:40:53 +00:00
parent 73d3667ef2
commit 78100cc928
6 changed files with 70 additions and 22 deletions

View File

@ -1,5 +1,5 @@
C Version\s2.8.6\s(CVS\s1080)
D 2003-08-22T03:00:00
C Add\sa\s"pk"\scolumn\sto\sthe\stable_info\spragma\swhich\sis\strue\sfor\seach\scolumn\nthat\sis\spart\sof\sthe\sprimary\skey.\s\sAdd\sa\s"foreign_key_list"\spragma\sthat\sgives\ninformation\sabout\sall\sforeign\skeys\sfor\sa\stable.\s\sBoth\schanges\sare\sexperimental.\s(CVS\s1081)
D 2003-08-23T22:40:54
F Makefile.in 4168f80989c60b195d378bcaa2e2046df03ee2ec
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@ -24,7 +24,7 @@ F src/auth.c c8f50d4507e37779d96ff3c55417bc2b612dfed6
F src/btree.c ba1cc0c71c3d2742b9a9047832335dc7d3656c45
F src/btree.h 9b7c09f1e64274d7bb74a57bbfc63778f67b1048
F src/btree_rb.c f30f5cddc4375c05bf361116da1492d9601760ca
F src/build.c 335a4db960a3305e16c64d67726dd534386df7c3
F src/build.c 5b379f8b699ecbb3d55f492f0e956b9da40b4a9c
F src/copy.c 9e47975ea96751c658bcf1a0c4f0bb7c6ee61e73
F src/delete.c 0f81e6799c089487615d38e042a2de4d2d6192bc
F src/encode.c 25ea901a9cefb3d93774afa4a06b57cb58acf544
@ -40,14 +40,14 @@ F src/os.h 729395fefcca4b81ae056aa9ff67b72bb40dd9e0
F src/pager.c a4fd3a61d63879365f775875edfffaa8c6f3d7f8
F src/pager.h 5da62c83443f26b1792cfd72c96c422f91aadd31
F src/parse.y 16aed0e3ed05445fa7f6a4209cc054208c7083c0
F src/pragma.c 3b4f5a800e7a2145bc1930f323232e297d4eb782
F src/pragma.c cee60f17679210e8acd30d5bdee855716d0c898c
F src/printf.c 12e45d482ac8abcc6f786fc99e5bed7dd9a51af0
F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe
F src/select.c 2fa83d6c972d3e3f379faee32e3621411490dedb
F src/shell.c c2ba26c850874964f5ec1ebf6c43406f28e44c4a
F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
F src/sqlite.h.in dafa83571810b6932f089b589c783355ef7a54b5
F src/sqliteInt.h cdcfdb5dca98359e443e23384b822a53ebd610ac
F src/sqliteInt.h e68eb1eeba806905acc9ed491f4c5b96587020df
F src/table.c 4301926464d88d2c2c7cd21c3360aa75bf068b95
F src/tclsqlite.c ec9e5b796bf9ec1483927e986828a205d4a7422a
F src/test1.c b12b585bfb4763df3262975ed8d3f4f274b5eaed
@ -117,7 +117,7 @@ F test/sort.test ba07b107c16070208e6aab3cadea66ba079d85ba
F test/subselect.test f0fea8cf9f386d416d64d152e3c65f9116d0f50f
F test/table.test 371a1fc1c470982b2f68f9732f903a5d96f949c4
F test/tableapi.test 3c80421a889e1d106df16e5800fa787f0d2914a6
F test/tclsqlite.test 751b358b45843f7cab569e362f2db135612b8c59
F test/tclsqlite.test 964fd2f6c11d384ab784c2afe52130f34261ce2d
F test/temptable.test c82bd6f800f10e8cf96921af6315e5f1c21e2692
F test/tester.tcl 2671536d3650c29e7c105219f277568b0884cb58
F test/trans.test 75e7a171b5d2d94ee56766459113e2ad0e5f809d
@ -168,7 +168,7 @@ F www/speed.tcl 2f6b1155b99d39adb185f900456d1d592c4832b3
F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
P a4e3e075e3b36e0f5f692067c5bf5e1b660d893d
R 2b873f18d52e7cd646dc86505cc9d590
P 0bde7ae2ba57de554c3531f3cb7e36bf56d3b12c
R 0a132fc8e8622ab698832e9d81c6e40c
U drh
Z 3086609ad6b63303ab73f4ef9de88394
Z bdf4b37b1c1e30ff9a4a67baf9818ee2

View File

@ -1 +1 @@
0bde7ae2ba57de554c3531f3cb7e36bf56d3b12c
5232b0665b84a9339a85918570093a376a0ea91f

View File

@ -23,7 +23,7 @@
** ROLLBACK
** PRAGMA
**
** $Id: build.c,v 1.157 2003/07/30 12:34:12 drh Exp $
** $Id: build.c,v 1.158 2003/08/23 22:40:54 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@ -702,7 +702,7 @@ void sqliteAddDefaultValue(Parse *pParse, Token *pVal, int minusFlag){
void sqliteAddPrimaryKey(Parse *pParse, IdList *pList, int onError){
Table *pTab = pParse->pNewTable;
char *zType = 0;
int iCol = -1;
int iCol = -1, i;
if( pTab==0 ) goto primary_key_exit;
if( pTab->hasPrimKey ){
sqliteSetString(&pParse->zErrMsg, "table \"", pTab->zName,
@ -713,10 +713,15 @@ void sqliteAddPrimaryKey(Parse *pParse, IdList *pList, int onError){
pTab->hasPrimKey = 1;
if( pList==0 ){
iCol = pTab->nCol - 1;
}else if( pList->nId==1 ){
pTab->aCol[iCol].isPrimKey = 1;
}else{
for(i=0; i<pList->nId; i++){
for(iCol=0; iCol<pTab->nCol; iCol++){
if( sqliteStrICmp(pList->a[0].zName, pTab->aCol[iCol].zName)==0 ) break;
}
if( iCol<pTab->nCol ) pTab->aCol[iCol].isPrimKey = 1;
}
if( pList->nId>1 ) iCol = -1;
}
if( iCol>=0 && iCol<pTab->nCol ){
zType = pTab->aCol[iCol].zType;

View File

@ -11,7 +11,7 @@
*************************************************************************
** This file contains code used to implement the PRAGMA command.
**
** $Id: pragma.c,v 1.10 2003/06/15 23:42:24 drh Exp $
** $Id: pragma.c,v 1.11 2003/08/23 22:40:54 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@ -343,6 +343,7 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
{ OP_ColumnName, 2, 0, "type"},
{ OP_ColumnName, 3, 0, "notnull"},
{ OP_ColumnName, 4, 0, "dflt_value"},
{ OP_ColumnName, 5, 0, "pk"},
};
int i;
sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface);
@ -357,7 +358,8 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].notNull, 0);
sqliteVdbeAddOp(v, OP_String, 0, 0);
sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC);
sqliteVdbeAddOp(v, OP_Callback, 5, 0);
sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].isPrimKey, 0);
sqliteVdbeAddOp(v, OP_Callback, 6, 0);
}
}
}else
@ -416,6 +418,45 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
}
}else
if( sqliteStrICmp(zLeft, "foreign_key_list")==0 ){
FKey *pFK;
Table *pTab;
pTab = sqliteFindTable(db, zRight, 0);
if( pTab ){
v = sqliteGetVdbe(pParse);
pFK = pTab->pFKey;
}
if( pTab && pFK ){
int i = 0;
static VdbeOp indexListPreface[] = {
{ OP_ColumnName, 0, 0, "id"},
{ OP_ColumnName, 1, 0, "seq"},
{ OP_ColumnName, 2, 0, "table"},
{ OP_ColumnName, 3, 0, "from"},
{ OP_ColumnName, 4, 0, "to"},
};
sqliteVdbeAddOpList(v, ArraySize(indexListPreface), indexListPreface);
while(pFK){
int j;
for(j=0; j<pFK->nCol; j++){
sqliteVdbeAddOp(v, OP_Integer, i, 0);
sqliteVdbeAddOp(v, OP_Integer, j, 0);
sqliteVdbeAddOp(v, OP_String, 0, 0);
sqliteVdbeChangeP3(v, -1, pFK->zTo, P3_STATIC);
sqliteVdbeAddOp(v, OP_String, 0, 0);
sqliteVdbeChangeP3(v, -1, pTab->aCol[pFK->aCol[j].iFrom].zName,
P3_STATIC);
sqliteVdbeAddOp(v, OP_String, 0, 0);
sqliteVdbeChangeP3(v, -1, pFK->aCol[j].zCol, P3_STATIC);
sqliteVdbeAddOp(v, OP_Callback, 5, 0);
}
++i;
pFK = pFK->pNextFrom;
}
}
}else
if( sqliteStrICmp(zLeft, "database_list")==0 ){
int i;
static VdbeOp indexListPreface[] = {
@ -437,6 +478,8 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
sqliteVdbeAddOp(v, OP_Callback, 3, 0);
}
}else
/*
** PRAGMA temp_store
** PRAGMA temp_store = "default"|"memory"|"file"

View File

@ -11,7 +11,7 @@
*************************************************************************
** Internal interface definitions for SQLite.
**
** @(#) $Id: sqliteInt.h,v 1.196 2003/08/09 21:32:28 drh Exp $
** @(#) $Id: sqliteInt.h,v 1.197 2003/08/23 22:40:54 drh Exp $
*/
#include "config.h"
#include "sqlite.h"
@ -384,7 +384,7 @@ struct Column {
char *zDflt; /* Default value of this column */
char *zType; /* Data type for this column */
u8 notNull; /* True if there is a NOT NULL constraint */
u8 isPrimKey; /* True if this column is an INTEGER PRIMARY KEY */
u8 isPrimKey; /* True if this column is part of the PRIMARY KEY */
u8 sortOrder; /* Some combination of SQLITE_SO_... values */
};

View File

@ -15,7 +15,7 @@
# interface is pretty well tested. This file contains some addition
# tests for fringe issues that the main test suite does not cover.
#
# $Id: tclsqlite.test,v 1.14 2003/08/19 14:31:02 drh Exp $
# $Id: tclsqlite.test,v 1.15 2003/08/23 22:40:54 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@ -70,7 +70,7 @@ if {[sqlite -encoding]=="UTF-8" && [sqlite -tcl-uses-utf]} {
do_test tcl-2.1 {
execsql "CREATE TABLE t\u0123x(a int, b\u1235 float)"
execsql "PRAGMA table_info(t\u0123x)"
} "0 a int 0 {} 1 b\u1235 float 0 {}"
} "0 a int 0 {} 0 1 b\u1235 float 0 {} 0"
do_test tcl-2.2 {
execsql "INSERT INTO t\u0123x VALUES(1,2.3)"
db eval "SELECT * FROM t\u0123x" result break
@ -82,7 +82,7 @@ if {[sqlite -encoding]=="iso8859" && [sqlite -tcl-uses-utf]} {
do_test tcl-2.1 {
execsql "CREATE TABLE t\251x(a int, b\306 float)"
execsql "PRAGMA table_info(t\251x)"
} "0 a int 0 {} 1 b\306 float 0 {}"
} "0 a int 0 {} 0 1 b\306 float 0 {} 0"
do_test tcl-2.2 {
execsql "INSERT INTO t\251x VALUES(1,2.3)"
db eval "SELECT * FROM t\251x" result break