:-) (CVS 7)

FossilOrigin-Name: fdf4b31a18fcbbcd358bf92c91fccbf94a79bc26
This commit is contained in:
drh 2000-05-29 23:30:50 +00:00
parent 348784efc0
commit b24fcbe6b4
6 changed files with 376 additions and 23 deletions

View File

@ -1,12 +1,12 @@
C :-)\s(CVS\s6)
D 2000-05-29T20:41:50
C :-)\s(CVS\s7)
D 2000-05-29T23:30:51
F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4
F Makefile.in f5e807375d080405b757239762db8f3b4124e08a
F README 0200f7787a68917ac55c07b97e3c3a982bccd0bc
F configure 00a5b5c82147a576fa6e82d7c1b0d55c321d6d2c x
F configure.in 6ccfd5fc80517f7cfe605a7fc7e0f62d962a233c
F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47
F src/build.c 45dc91016e13dec70620b049a53ba785b4a0c76b
F src/build.c 56fd0763b19fa5aa3bdeb4acb4566b17305428a8
F src/dbbe.c ab05293e89525041eaab8b4aca10516db3648792
F src/dbbe.h bedeb3a0985bb584458e7849fb59927e99e751e6
F src/main.c 25cce7bce0eb3ba10bada7c05f4b38dc6dbbc86f
@ -16,11 +16,12 @@ F src/sqlite.h 2397c17a8f4ca90c09acab0100dc7e2f8f441b69
F src/sqliteInt.h 0365970442441b5e9b74e1e828afdeac7b0662be
F src/tclsqlite.c 30f4317e1fc9119b130f29ee5dac4ab9121de68b
F src/tokenize.c ab578d90ec6ab117b7ade6e6cfbcb5b0f9cad500
F src/util.c b2e2a4dc55f7cbd41a7d9e0a8473eedd3b2691c8
F src/util.c 171dc6334fde23ccdf6e058d98c23eaa88445944
F src/vdbe.c 80132b6bb9a744d1990a1c16666d54baaff2dbc3
F src/vdbe.h e721ad308f2e6ca805cebc4dd0a196ce4419d030
F src/where.c 67ffea57920e16b33c580e9a9b9855b3ec9dea7b
F test/crttbl.test 49a73b927ad85bf8edae7e5311fde34bf5b2c1fb
F test/crtidx.test 56de1628220deafe33037c40369229eb02c1907d
F test/crttbl.test 45889cb39e3c3de9e10d79057f424a38ecebe93f
F test/tester.tcl 31a9077926a5eb54dcae11b2c92abc1263dd675c
F tool/gdbmdump.c 529e67c78d920606ba196326ea55b57b75fcc82b
F tool/lemon.c cff35578b3c4d1491021b6418016639ebe21b1a5
@ -31,7 +32,7 @@ F tool/renumberOps.awk 6d067177ad5f8d711b79577b462da9b3634bd0a9
F www/c_interface.tcl f875864edf7974157d1c257ca08de854660882a5
F www/index.tcl 67b2bee04077377eacede2b11e21fe37ef7e10c6
F www/sqlite.tcl 947e067bcc347dc767af4c1a6e5a8d47d8404aa3
P 9fd0628af897c54c122fdef02f79788385ece39c
R b39dfec9006cd0b187aa3d6ee1e9799f
P 1517f85243b63511c2ceb73a10453c5ae56d3428
R 57cc33953bef9654e813c3a2624d0bb4
U drh
Z ad70bffed13ea99cad14d2118369d246
Z b4846e605fc44b608a9e06c083145b56

View File

@ -1 +1 @@
1517f85243b63511c2ceb73a10453c5ae56d3428
fdf4b31a18fcbbcd358bf92c91fccbf94a79bc26

View File

@ -24,7 +24,7 @@
** This file contains C code routines that are called by the parser
** when syntax rules are reduced.
**
** $Id: build.c,v 1.2 2000/05/29 17:44:25 drh Exp $
** $Id: build.c,v 1.3 2000/05/29 23:30:51 drh Exp $
*/
#include "sqliteInt.h"
@ -243,7 +243,7 @@ void sqliteAddColumn(Parse *pParse, Token *pName){
char **pz;
if( (p = pParse->pNewTable)==0 ) return;
if( (p->nCol & 0x7)==0 ){
p->azCol = sqliteRealloc( p->azCol, (p->nCol+8)*sizeof(p->azCol[0]));
p->azCol = sqliteRealloc( p->azCol, (p->nCol+9)*sizeof(p->azCol[0]));
}
if( p->azCol==0 ){
p->nCol = 0;
@ -319,8 +319,8 @@ static Table *sqliteTableFromToken(Parse *pParse, Token *pTok){
Table *pTab = sqliteFindTable(pParse->db, zName);
sqliteFree(zName);
if( pTab==0 ){
sqliteSetNString(&pParse->zErrMsg, "no such table: \"", 0,
pTok->z, pTok->n, "\"", 1, 0);
sqliteSetNString(&pParse->zErrMsg, "no such table: ", 0,
pTok->z, pTok->n, 0);
pParse->nErr++;
}
return pTab;
@ -430,8 +430,8 @@ void sqliteCreateIndex(
}
if( pTab==0 || pParse->nErr ) goto exit_create_index;
if( pTab->readOnly ){
sqliteSetString(&pParse->zErrMsg, "table \"", pTab->zName,
"\" may not have new indices added", 0);
sqliteSetString(&pParse->zErrMsg, "table ", pTab->zName,
" may not have new indices added", 0);
pParse->nErr++;
goto exit_create_index;
}
@ -495,8 +495,8 @@ void sqliteCreateIndex(
if( sqliteStrICmp(pList->a[i].zName, pTab->azCol[j])==0 ) break;
}
if( j>=pTab->nCol ){
sqliteSetString(&pParse->zErrMsg, "table being indexed has no field "
"named \"", pList->a[i].zName, "\"", 0);
sqliteSetString(&pParse->zErrMsg, "table ", pTab->zName,
" has no field named ", pList->a[i].zName, 0);
pParse->nErr++;
sqliteFree(pIndex);
goto exit_create_index;
@ -530,9 +530,9 @@ void sqliteCreateIndex(
{ OP_Open, 0, 0, MASTER_NAME},
{ OP_New, 0, 0, 0},
{ OP_String, 0, 0, "index"},
{ OP_String, 0, 0, 0}, /* 2 */
{ OP_String, 0, 0, 0}, /* 3 */
{ OP_String, 0, 0, 0}, /* 4 */
{ OP_String, 0, 0, 0}, /* 5 */
{ OP_MakeRecord, 4, 0, 0},
{ OP_Put, 0, 0, 0},
{ OP_Close, 0, 0, 0},
@ -550,9 +550,9 @@ void sqliteCreateIndex(
int base;
n = (int)pEnd->z - (int)pStart->z + 1;
base = sqliteVdbeAddOpList(v, ArraySize(addTable), addTable);
sqliteVdbeChangeP3(v, base+2, pIndex->zName, 0);
sqliteVdbeChangeP3(v, base+3, pTab->zName, 0);
sqliteVdbeChangeP3(v, base+4, pStart->z, n);
sqliteVdbeChangeP3(v, base+3, pIndex->zName, 0);
sqliteVdbeChangeP3(v, base+4, pTab->zName, 0);
sqliteVdbeChangeP3(v, base+5, pStart->z, n);
}
sqliteVdbeAddOp(v, OP_Open, 0, 0, pTab->zName, 0);
sqliteVdbeAddOp(v, OP_Open, 1, 0, pIndex->zName, 0);

View File

@ -26,7 +26,7 @@
** This file contains functions for allocating memory, comparing
** strings, and stuff like that.
**
** $Id: util.c,v 1.2 2000/05/29 17:44:25 drh Exp $
** $Id: util.c,v 1.3 2000/05/29 23:30:51 drh Exp $
*/
#include "sqliteInt.h"
#include <stdarg.h>
@ -67,6 +67,7 @@ void *sqliteRealloc(void *p, int n){
sqliteFree(p);
return 0;
}
/* printf("realloc 0x%x size: %d bytes\n", (int)p, n); */
return realloc(p, n);
}

204
test/crtidx.test Normal file
View File

@ -0,0 +1,204 @@
# Copyright (c) 1999, 2000 D. Richard Hipp
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
# Author contact information:
# drh@hwaci.com
# http://www.hwaci.com/drh/
#
#***********************************************************************
# This file implements regression tests for SQLite library. The
# focus of this file is testing the CREATE INDEX statement.
#
# $Id: crtidx.test,v 1.1 2000/05/29 23:30:51 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
# Create a basic index and verify it is added to sqlite_master
#
do_test crtidx-1.1 {
execsql {CREATE TABLE test1(f1 int, f2 int, f3 int)}
execsql {CREATE INDEX index1 ON test1(f1)}
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {index1 test1}
do_test crtidx-1.1b {
execsql {SELECT name, sql, tbl_name, type FROM sqlite_master
WHERE name='index1'}
} {index1 {CREATE INDEX index1 ON test1(f1)} test1 index}
do_test crtidx-1.1c {
db close
sqlite db testdb
execsql {SELECT name, sql, tbl_name, type FROM sqlite_master
WHERE name='index1'}
} {index1 {CREATE INDEX index1 ON test1(f1)} test1 index}
do_test crtidx-1.1d {
db close
sqlite db testdb
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {index1 test1}
# Verify that the index dies with the table
#
do_test crtidx-1.2 {
execsql {DROP TABLE test1}
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {}
# Try adding an index to a table that does not exist
#
do_test crtidx-2.1 {
set v [catch {execsql {CREATE INDEX index1 ON test1(f1)}} msg]
lappend v $msg
} {1 {no such table: test1}}
# Try adding an index on a field of a table where the table
# exists but the field does not.
#
do_test crtidx-2.1 {
execsql {CREATE TABLE test1(f1 int, f2 int, f3 int)}
set v [catch {execsql {CREATE INDEX index1 ON test1(f4)}} msg]
lappend v $msg
} {1 {table test1 has no field named f4}}
# Try an index with some fields that match and others that do now.
#
do_test crtidx-2.2 {
set v [catch {execsql {CREATE INDEX index1 ON test1(f1, f2, f4, f3)}} msg]
execsql {DROP TABLE test1}
lappend v $msg
} {1 {table test1 has no field named f4}}
# Try creating a bunch of indices on the same table
#
set r {}
for {set i 1} {$i<100} {incr i} {
lappend r index$i
}
do_test crtidx-3.1 {
execsql {CREATE TABLE test1(f1 int, f2 int, f3 int, f4 int, f5 int)}
for {set i 1} {$i<100} {incr i} {
set sql "CREATE INDEX index$i ON test1(f[expr {($i%5)+1}])"
execsql $sql
}
execsql {SELECT name FROM sqlite_master
WHERE type='index' AND tbl_name='test1'
ORDER BY name}
} $r
# Add a single entry to the table. Verify that files are created
# for every index.
#
set r {}
for {set i 1} {$i<100} {incr i} {
lappend r testdb/index$i.tbl
}
do_test crtidx-3.2 {
execsql {INSERT INTO test1 VALUES(1,2,3,4,5)}
lsort -dictionary [glob testdb/index*.tbl]
} $r
# Verify that all the indices go away when we drop the table.
#
do_test crtidx-3.3 {
execsql {DROP TABLE test1}
execsql {SELECT name FROM sqlite_master
WHERE type='index' AND tbl_name='test1'
ORDER BY name}
} {}
do_test crtidx-3.4 {
lsort -dictionary [glob -nocomplain testdb/index*.tbl]
} {}
# Create a table and insert values into that table. Then create
# an index on that table. Verify that we can select values
# from the table correctly using the index.
#
do_test crtidx-4.1 {
execsql {CREATE TABLE test1(cnt int, power int)}
for {set i 1} {$i<20} {incr i} {
execsql "INSERT INTO test1 VALUES($i,[expr {int(pow(2,$i))}])"
}
execsql {CREATE INDEX index1 ON test1(cnt)}
execsql {CREATE INDEX index2 ON test1(cnt)}
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {index1 index2 test1}
do_test crtidx-4.2 {
execsql {SELECT cnt FROM test1 WHERE power=4}
} {2}
do_test crtidx-4.3 {
execsql {SELECT cnt FROM test1 WHERE power=1024}
} {10}
do_test crtidx-4.4 {
execsql {SELECT power FROM test1 WHERE cnt=6}
} {64}
do_test crtidx-4.5 {
execsql {DROP TABLE test1}
} {}
# Do not allow indices to be added to sqlite_master
#
do_test crtidx-5.1 {
set v [catch {execsql {CREATE INDEX index1 ON sqlite_master(name)}} msg]
lappend v $msg
} {1 {table sqlite_master may not have new indices added}}
do_test crtidx-5.2 {
execsql {SELECT name FROM sqlite_master}
} {}
# Do not allow indices with duplicate names to be added
#
do_test crtidx-6.1 {
execsql {CREATE TABLE test1(f1 int, f2 int)}
execsql {CREATE TABLE test2(g1 real, g2 real)}
execsql {CREATE INDEX index1 ON test1(f1)}
set v [catch {execsql {CREATE INDEX index1 ON test2(g1)}} msg]
lappend v $msg
} {1 {index "index1" already exists}}
do_test crtidx-6.1b {
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {index1 test1 test2}
do_test crtidx-6.2 {
set v [catch {execsql {CREATE INDEX test1 ON test2(g1)}} msg]
lappend v $msg
} {1 {there is already a table named "test1"}}
do_test crtidx-6.2b {
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {index1 test1 test2}
do_test crtidx-6.3 {
execsql {DROP TABLE test1}
execsql {DROP TABLE test2}
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {}
# Create a primary key
#
do_test crtidx-7.1 {
execsql {CREATE TABLE test1(f1 int, f2 int primary key)}
for {set i 1} {$i<20} {incr i} {
execsql "INSERT INTO test1 VALUES($i,[expr {int(pow(2,$i))}])"
}
lsort -dictionary [glob testdb/test1*.tbl]
} {testdb/test1.tbl testdb/test1__primary_key.tbl}
do_test crtidx-7.2 {
execsql {SELECT f1 FROM test1 WHERE f2=65536}
} {16}
do_test crtidx-7.3 {
set code [execsql {EXPLAIN SELECT f1 FROM test1 WHERE f2=65536}]
expr {[lsearch $code test1__primary_key]>0}
} {1}
finish_test

View File

@ -23,7 +23,7 @@
# This file implements regression tests for SQLite library. The
# focus of this file is testing the CREATE TABLE statement.
#
# $Id: crttbl.test,v 1.1 2000/05/29 20:41:51 drh Exp $
# $Id: crttbl.test,v 1.2 2000/05/29 23:30:51 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@ -89,4 +89,151 @@ do_test crttbl-1.6 {
execsql {SELECT name FROM sqlite_master}
} {}
# Verify that we cannot make two tables with the same name
#
do_test crttbl-2.1 {
execsql {CREATE TABLE test2(one text)}
set v [catch {execsql {CREATE TABLE test2(two text)}} msg]
lappend v $msg
} {1 {table "test2" already exists}}
do_test crttbl-2.1b {
set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
lappend v $msg
} {1 {table "sqlite_master" already exists}}
do_test crttbl-2.1c {
db close
sqlite db testdb
set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
lappend v $msg
} {1 {table "sqlite_master" already exists}}
do_test crttbl-2.1d {
execsql {DROP TABLE test2; SELECT name FROM sqlite_master}
} {}
# Verify that we cannot make a table with the same name as an index
#
do_test crttbl-2.2 {
execsql {CREATE TABLE test2(one text); CREATE INDEX test3 ON test2(one)}
set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
lappend v $msg
} {1 {there is already an index named "test3"}}
do_test crttbl-2.2b {
db close
sqlite db testdb
set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
lappend v $msg
} {1 {there is already an index named "test3"}}
do_test crttbl-2.2c {
execsql {DROP INDEX test3}
set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
lappend v $msg
} {0 {}}
do_test crttbl-2.2d {
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {test2 test3}
do_test crttbl-2.2e {
execsql {DROP TABLE test2; DROP TABLE test3}
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {}
# Create a table with many field names
#
set big_table \
{CREATE TABLE big(
f1 varchar(20),
f2 char(10),
f3 varchar(30),
f4 text,
f5 text,
f6 text,
f7 text,
f8 text,
f9 text,
f10 text,
f11 text,
f12 text,
f13 text,
f14 text,
f15 text,
f16 text,
f17 text,
f18 text,
f19 text,
f20 text
)}
do_test crttbl-3.1 {
execsql $big_table
execsql {SELECT sql FROM sqlite_master}
} \{$big_table\}
do_test crttbl-3.2 {
set v [catch {execsql {CREATE TABLE BIG(xyz foo)}} msg]
lappend v $msg
} {1 {table "BIG" already exists}}
do_test crttbl-3.3 {
set v [catch {execsql {CREATE TABLE biG(xyz foo)}} msg]
lappend v $msg
} {1 {table "biG" already exists}}
do_test crttbl-3.4 {
set v [catch {execsql {CREATE TABLE bIg(xyz foo)}} msg]
lappend v $msg
} {1 {table "bIg" already exists}}
do_test crttbl-3.5 {
db close
sqlite db testdb
set v [catch {execsql {CREATE TABLE Big(xyz foo)}} msg]
lappend v $msg
} {1 {table "Big" already exists}}
do_test crttbl-3.6 {
execsql {DROP TABLE big}
execsql {SELECT name FROM sqlite_master}
} {}
# Try creating large numbers of tables
#
set r {}
for {set i 1} {$i<=100} {incr i} {
lappend r test$i
}
do_test crttbl-4.1 {
for {set i 1} {$i<=100} {incr i} {
set sql "CREATE TABLE test$i ("
for {set k 1} {$k<$i} {incr k} {
append sql "field$k text,"
}
append sql "last_field text)"
execsql $sql
}
execsql {SELECT name FROM sqlite_master ORDER BY name}
} $r
do_test crttbl-4.1b {
db close
sqlite db testdb
execsql {SELECT name FROM sqlite_master ORDER BY name}
} $r
# Drop the even number tables
#
set r {}
for {set i 1} {$i<=100} {incr i 2} {
lappend r test$i
}
do_test crttbl-4.2 {
for {set i 2} {$i<=100} {incr i 2} {
set sql "DROP TABLE TEST$i"
execsql $sql
}
execsql {SELECT name FROM sqlite_master ORDER BY name}
} $r
# Drop the odd number tables
#
do_test crttbl-4.3 {
for {set i 1} {$i<=100} {incr i 2} {
set sql "DROP TABLE test$i"
execsql $sql
}
execsql {SELECT name FROM sqlite_master ORDER BY name}
} {}
finish_test