Reinstate test cases for the limit tests. The sqlite3_limit() API is now

tested and working. (CVS 4899)

FossilOrigin-Name: 4c4be4c3c8aae97f1d85442b25afba9f0b02c8b3
This commit is contained in:
drh 2008-03-20 16:30:17 +00:00
parent 81a392f7d7
commit b1a6c3c1cc
11 changed files with 416 additions and 238 deletions

View File

@ -1,5 +1,5 @@
C Do\snot\srun\scrash7.test\sas\spart\sof\sa\squick\stest.\s(CVS\s4898)
D 2008-03-20T16:26:49
C Reinstate\stest\scases\sfor\sthe\slimit\stests.\s\sThe\ssqlite3_limit()\sAPI\sis\snow\ntested\sand\sworking.\s(CVS\s4899)
D 2008-03-20T16:30:18
F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
F Makefile.in cf434ce8ca902e69126ae0f94fc9f7dc7428a5fa
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@ -95,16 +95,16 @@ F src/complete.c 4cf68fd75d60257524cbe74f87351b9848399131
F src/date.c e41ce4513fb0e359dc678d6bddb4ace135fe365d
F src/delete.c 217cd5559e00bb135dc626d4ea4ac713604729e8
F src/experimental.c 1b2d1a6cd62ecc39610e97670332ca073c50792b
F src/expr.c 11e00cafa3c6c7e432b06f06c923d1332349354a
F src/expr.c 8758d120f03f5856b594724732e42497efe00731
F src/fault.c 039abb45c9dbcbdf575ec2a23ae38db01bc2f7b2
F src/func.c 3ac6e84e601321519d1b452c95cf92a51403fc4d
F src/func.c c9e8c7ff4c45027edee89bde7adbf86a3a3b2afe
F src/hash.c 53655c312280211444bfe23af6490a460aec2980
F src/hash.h 031cd9f915aff27e12262cb9eb570ac1b8326b53
F src/insert.c 358c80592c20a61a8d5b4a127215b5e25de652f4
F src/journal.c 807bed7a158979ac8d63953e1774e8d85bff65e2
F src/legacy.c cb1939fdeb91ea88fb44fbd2768a10e14bc44650
F src/loadext.c f26b22f7c84153c9d5dbd7c240848823c6e6b6dc
F src/main.c 03a53976e226dfb5867b3102db5b9ec2e40fc0e7
F src/main.c 24711c8e40107aad521eaa56ddf16068222061db
F src/malloc.c 60e392a4c12c839517f9b0db7b995f825444fb35
F src/md5.c c5fdfa5c2593eaee2e32a5ce6c6927c986eaf217
F src/mem1.c fc716ff521b6dd3e43eaa211967383308800e70a
@ -130,21 +130,21 @@ F src/os_win.c 3a60bddd07ea6f8adb2314dd5996ac97b988f403
F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
F src/pager.c 22241b59c80ca083a96816df434adb8c097afcd4
F src/pager.h b1e2258f03878c14b06a95bfa362e8c5c9638170
F src/parse.y 00f2698c8ae84f315be5e3f10b63c94f531fdd6d
F src/parse.y b0ee84d94218046ea88c2a6561005710d127ca7d
F src/pragma.c f64eed914518c28d1863356163dea1e6f58e28f2
F src/prepare.c 1b71b5d43ba3d88f2d3c2a6d084f28ac209df956
F src/printf.c 88674589be4b9eac3987ff735e74681864c88c32
F src/printf.c 05d2b44d7b5b80c8a4a09108ddad9c20e254370d
F src/random.c 8b6ab5418cf0f4dde551730825d67da1457c2b3c
F src/select.c 2a0f383a16c780b8ee8108e994c2f6c4f82233a9
F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96
F src/shell.c 22297fffa6f00a6c6d44020fa13b1184a1bb372d
F src/sqlite.h.in be6a431e128b831df7d62fc48b7ce2043f55cf90
F src/sqlite.h.in 8c9d194ccb6b2b0d00078192c2c4f92d46a7abe4
F src/sqlite3ext.h faacd0e6a81aabee0861c6d7883c9172e74ef5b3
F src/sqliteInt.h ec78c602dc2675f675ca4f9fbc72e60a262c40e9
F src/sqliteInt.h c96aca7c69ba463ee09eac19b1ac9974752b467e
F src/sqliteLimit.h eecbc288b410ae5565e71aaa4a439aae57bb0707
F src/table.c 2c48c575dd59b3a6c5c306bc55f51a9402cf429a
F src/tclsqlite.c d42912617d4734b8f9195416badf5b27e512ded2
F src/test1.c 935f327fe989694a3aa07ab78ae5c00705651b34
F src/test1.c aab521bef2a038dfdf1bcafb4f3372285be7d91b
F src/test2.c da3c4016fc1e08fa1a133ca81591ee8ca99ce8e7
F src/test3.c 5c7452038ab27aa698070799b10132f26cdd2a80
F src/test4.c c2c0f5dc907f1346f5d4b65eb5799f11eb9e4071
@ -450,7 +450,7 @@ F test/speed1.test 22e1b27af0683ed44dcd2f93ed817a9c3e65084a
F test/speed2.test 53177056baf6556dcbdcf032bbdfc41c1aa74ded
F test/speed3.test e312d7e442a5047d730569fdae2ba99bc94e1a13
F test/speed4.test 20d8ea20bea3ca09c3ef3b5ec820a17e58e132cb
F test/sqllimits1.test 29d87be26425de0dd185f6dc24a0440418646a0f
F test/sqllimits1.test 9ecac01f2f51e3f5f7407a53af2483d096a3f540
F test/subquery.test 8203f85db56ba022a57a0589890090c8feed4e59
F test/subselect.test 974e87f8fc91c5f00dd565316d396a5a6c3106c4
F test/substr.test 4be572ac017143e59b4058dc75c91a0d0dc6d4e0
@ -624,7 +624,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
P 60c77882b2de9f6a45f8bd87c9c6a0cc613f8373
R 470ea6093d2c3208cc1c3a8559153543
U danielk1977
Z bc9accc34d4c081a01d0d05b853c649a
P 53b4a09040341a981b2f33399a1ddcee952ba3ef
R aff205d8a20c135ccafeedae04a2e788
U drh
Z e01b238f8fcef143071d3d310a36fa66

View File

@ -1 +1 @@
53b4a09040341a981b2f33399a1ddcee952ba3ef
4c4be4c3c8aae97f1d85442b25afba9f0b02c8b3

View File

@ -12,7 +12,7 @@
** This file contains routines used for analyzing expressions and
** for generating VDBE code that evaluates expressions in SQLite.
**
** $Id: expr.c,v 1.355 2008/03/20 14:03:29 drh Exp $
** $Id: expr.c,v 1.356 2008/03/20 16:30:18 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@ -696,10 +696,10 @@ no_mem:
void sqlite3ExprListCheckLength(
Parse *pParse,
ExprList *pEList,
int iLimit,
const char *zObject
){
if( pEList && pEList->nExpr>iLimit ){
int mx = pParse->db->aLimit[SQLITE_LIMIT_COLUMN];
if( pEList && pEList->nExpr>mx ){
sqlite3ErrorMsg(pParse, "too many columns in %s", zObject);
}
}

View File

@ -16,7 +16,7 @@
** sqliteRegisterBuildinFunctions() found at the bottom of the file.
** All other code has file scope.
**
** $Id: func.c,v 1.190 2008/03/20 14:03:29 drh Exp $
** $Id: func.c,v 1.191 2008/03/20 16:30:18 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@ -243,7 +243,7 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
** allocation fails, call sqlite3_result_error_nomem() to notify
** the database handle that malloc() has failed.
*/
static void *contextMalloc(sqlite3_context *context, int nByte){
static void *contextMalloc(sqlite3_context *context, i64 nByte){
char *z;
if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
sqlite3_result_error_toobig(context);
@ -270,7 +270,7 @@ static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
/* Verify that the call to _bytes() does not invalidate the _text() pointer */
assert( z2==(char*)sqlite3_value_text(argv[0]) );
if( z2 ){
z1 = contextMalloc(context, n+1);
z1 = contextMalloc(context, ((i64)n)+1);
if( z1 ){
memcpy(z1, z2, n+1);
for(i=0; z1[i]; i++){
@ -290,7 +290,7 @@ static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
/* Verify that the call to _bytes() does not invalidate the _text() pointer */
assert( z2==(char*)sqlite3_value_text(argv[0]) );
if( z2 ){
z1 = contextMalloc(context, n+1);
z1 = contextMalloc(context, ((i64)n)+1);
if( z1 ){
memcpy(z1, z2, n+1);
for(i=0; z1[i]; i++){
@ -694,7 +694,7 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
char const *zBlob = sqlite3_value_blob(argv[0]);
int nBlob = sqlite3_value_bytes(argv[0]);
assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
zText = (char *)contextMalloc(context, (2*nBlob)+4);
zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
if( zText ){
int i;
for(i=0; i<nBlob; i++){
@ -718,7 +718,7 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
if( zArg==0 ) return;
for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
z = contextMalloc(context, i+n+3);
z = contextMalloc(context, ((i64)i)+((i64)n)+3);
if( z ){
z[0] = '\'';
for(i=0, j=1; zArg[i]; i++){
@ -751,7 +751,7 @@ static void hexFunc(
pBlob = sqlite3_value_blob(argv[0]);
n = sqlite3_value_bytes(argv[0]);
assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
z = zHex = contextMalloc(context, n*2 + 1);
z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
if( zHex ){
for(i=0; i<n; i++, pBlob++){
unsigned char c = *pBlob;
@ -818,7 +818,7 @@ static void replaceFunc(
assert( zRep==sqlite3_value_text(argv[2]) );
nOut = nStr + 1;
assert( nOut<SQLITE_MAX_LENGTH );
zOut = contextMalloc(context, (int)nOut);
zOut = contextMalloc(context, (i64)nOut);
if( zOut==0 ){
return;
}
@ -895,7 +895,7 @@ static void trimFunc(
SQLITE_SKIP_UTF8(z);
}
if( nChar>0 ){
azChar = contextMalloc(context, nChar*(sizeof(char*)+1));
azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
if( azChar==0 ){
return;
}

View File

@ -14,7 +14,7 @@
** other files are for internal use by SQLite and should not be
** accessed by users of the library.
**
** $Id: main.c,v 1.426 2008/03/20 14:03:29 drh Exp $
** $Id: main.c,v 1.427 2008/03/20 16:30:18 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@ -933,7 +933,7 @@ static int createCollation(
** initializer must be kept in sync with the SQLITE_LIMIT_*
** #defines in sqlite3.h.
*/
static const aHardLimit[] = {
static const int aHardLimit[] = {
SQLITE_MAX_LENGTH,
SQLITE_MAX_SQL_LENGTH,
SQLITE_MAX_COLUMN,
@ -942,7 +942,6 @@ static const aHardLimit[] = {
SQLITE_MAX_VDBE_OP,
SQLITE_MAX_FUNCTION_ARG,
SQLITE_MAX_ATTACHED,
SQLITE_MAX_PAGE_COUNT,
SQLITE_MAX_LIKE_PATTERN_LENGTH,
SQLITE_MAX_VARIABLE_NUMBER,
};
@ -977,9 +976,6 @@ static const aHardLimit[] = {
#if SQLITE_MAX_ATTACH<0 || SQLITE_MAX_ATTACH>30
# error SQLITE_MAX_ATTACH must be between 0 and 30
#endif
#if SQLITE_MAX_PAGE_COUNT<1
# error SQLITE_MAX_PAGE_COUNT must be at least 1
#endif
#if SQLITE_MAX_LIKE_PATTERN_LENGTH<1
# error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1
#endif

View File

@ -14,7 +14,7 @@
** the parser. Lemon will also generate a header file containing
** numeric codes for all of the tokens.
**
** @(#) $Id: parse.y,v 1.240 2008/01/22 23:37:10 drh Exp $
** @(#) $Id: parse.y,v 1.241 2008/03/20 16:30:18 drh Exp $
*/
// All token codes are small integers with #defines that begin with "TK_"
@ -573,7 +573,7 @@ where_opt(A) ::= WHERE expr(X). {A = X;}
////////////////////////// The UPDATE command ////////////////////////////////
//
cmd ::= UPDATE orconf(R) fullname(X) SET setlist(Y) where_opt(Z). {
sqlite3ExprListCheckLength(pParse,Y,SQLITE_MAX_COLUMN,"set list");
sqlite3ExprListCheckLength(pParse,Y,"set list");
sqlite3Update(pParse,X,Y,Z,R);
}
@ -896,7 +896,7 @@ idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder(Z). {
sqlite3ExprSetColl(pParse, p, &C);
}
A = sqlite3ExprListAppend(pParse,X, p, &Y);
sqlite3ExprListCheckLength(pParse, A, SQLITE_MAX_COLUMN, "index");
sqlite3ExprListCheckLength(pParse, A, "index");
if( A ) A->a[A->nExpr-1].sortOrder = Z;
}
idxlist(A) ::= idxitem(Y) collate(C) sortorder(Z). {
@ -906,7 +906,7 @@ idxlist(A) ::= idxitem(Y) collate(C) sortorder(Z). {
sqlite3ExprSetColl(pParse, p, &C);
}
A = sqlite3ExprListAppend(pParse,0, p, &Y);
sqlite3ExprListCheckLength(pParse, A, SQLITE_MAX_COLUMN, "index");
sqlite3ExprListCheckLength(pParse, A, "index");
if( A ) A->a[A->nExpr-1].sortOrder = Z;
}
idxitem(A) ::= nm(X). {A = X;}

View File

@ -735,14 +735,17 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
return;
}
}else{
p->nAlloc += p->nAlloc + N + 1;
if( p->nAlloc > p->mxAlloc ){
i64 szNew = p->nAlloc;
szNew += N + 1;
if( szNew > p->mxAlloc ){
p->nAlloc = p->mxAlloc;
if( p->nChar+N >= p->nAlloc ){
if( ((i64)p->nChar)+((i64)N) >= p->nAlloc ){
sqlite3StrAccumReset(p);
p->tooBig = 1;
return;
}
}else{
p->nAlloc = szNew;
}
zNew = sqlite3_malloc( p->nAlloc );
if( zNew ){

View File

@ -30,7 +30,7 @@
** the version number) and changes its name to "sqlite3.h" as
** part of the build process.
**
** @(#) $Id: sqlite.h.in,v 1.296 2008/03/20 14:03:29 drh Exp $
** @(#) $Id: sqlite.h.in,v 1.297 2008/03/20 16:30:18 drh Exp $
*/
#ifndef _SQLITE3_H_
#define _SQLITE3_H_
@ -2245,9 +2245,6 @@ int sqlite3_limit(sqlite3*, int id, int newVal);
** <dt>SQLITE_LIMIT_ATTACHED</dt>
** <dd>The maximum number of attached databases.</dd>
**
** <dt>SQLITE_LIMIT_PAGE_COUNT</dt>
** <dd>The maximum number of pages in a database.</dd>
**
** <dt>SQLITE_LIMIT_LIKE_PATTERN_LENGTH</dt>
** <dd>The maximum length of the pattern argument to the LIKE or
** GLOB operators.</dd>
@ -2265,9 +2262,8 @@ int sqlite3_limit(sqlite3*, int id, int newVal);
#define SQLITE_LIMIT_VDBE_OP 5
#define SQLITE_LIMIT_FUNCTION_ARG 6
#define SQLITE_LIMIT_ATTACHED 7
#define SQLITE_LIMIT_PAGE_COUNT 8
#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 9
#define SQLITE_LIMIT_VARIABLE_NUMBER 10
#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8
#define SQLITE_LIMIT_VARIABLE_NUMBER 9
/*
** CAPI3REF: Compiling An SQL Statement {F13010}

View File

@ -11,7 +11,7 @@
*************************************************************************
** Internal interface definitions for SQLite.
**
** @(#) $Id: sqliteInt.h,v 1.677 2008/03/20 14:03:29 drh Exp $
** @(#) $Id: sqliteInt.h,v 1.678 2008/03/20 16:30:18 drh Exp $
*/
#ifndef _SQLITEINT_H_
#define _SQLITEINT_H_
@ -2069,7 +2069,7 @@ int sqlite3VtabBegin(sqlite3 *, sqlite3_vtab *);
FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
void sqlite3InvalidFunction(sqlite3_context*,int,sqlite3_value**);
int sqlite3Reprepare(Vdbe*);
void sqlite3ExprListCheckLength(Parse*, ExprList*, int, const char*);
void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);

View File

@ -13,7 +13,7 @@
** is not included in the SQLite library. It is used for automated
** testing of the SQLite library.
**
** $Id: test1.c,v 1.293 2008/03/19 14:15:35 drh Exp $
** $Id: test1.c,v 1.294 2008/03/20 16:30:18 drh Exp $
*/
#include "sqliteInt.h"
#include "tcl.h"
@ -4320,6 +4320,62 @@ static int file_control_test(
return TCL_OK;
}
/*
** tclcmd: sqlite3_limit DB ID VALUE
**
** This TCL command runs the sqlite3_limit interface and
** verifies correct operation of the same.
*/
static int test_limit(
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
int objc, /* Number of arguments */
Tcl_Obj *CONST objv[] /* Command arguments */
){
sqlite3 *db;
int rc;
static const struct {
char *zName;
int id;
} aId[] = {
{ "SQLITE_LIMIT_LENGTH", SQLITE_LIMIT_LENGTH },
{ "SQLITE_LIMIT_SQL_LENGTH", SQLITE_LIMIT_SQL_LENGTH },
{ "SQLITE_LIMIT_COLUMN", SQLITE_LIMIT_COLUMN },
{ "SQLITE_LIMIT_EXPR_DEPTH", SQLITE_LIMIT_EXPR_DEPTH },
{ "SQLITE_LIMIT_COMPOUND_SELECT", SQLITE_LIMIT_COMPOUND_SELECT },
{ "SQLITE_LIMIT_VDBE_OP", SQLITE_LIMIT_VDBE_OP },
{ "SQLITE_LIMIT_FUNCTION_ARG", SQLITE_LIMIT_FUNCTION_ARG },
{ "SQLITE_LIMIT_ATTACHED", SQLITE_LIMIT_ATTACHED },
{ "SQLITE_LIMIT_LIKE_PATTERN_LENGTH", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
{ "SQLITE_LIMIT_VARIABLE_NUMBER", SQLITE_LIMIT_VARIABLE_NUMBER },
};
int i, id;
int val;
const char *zId;
if( objc!=4 ){
Tcl_AppendResult(interp, "wrong # args: should be \"",
Tcl_GetStringFromObj(objv[0], 0), " DB ID VALUE", 0);
return TCL_ERROR;
}
if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
zId = Tcl_GetString(objv[2]);
for(i=0; i<sizeof(aId)/sizeof(aId[0]); i++){
if( strcmp(zId, aId[i].zName)==0 ){
id = aId[i].id;
break;
}
}
if( i>=sizeof(aId)/sizeof(aId[0]) ){
Tcl_AppendResult(interp, "unknown limit type: ", zId, (char*)0);
return TCL_ERROR;
}
if( Tcl_GetIntFromObj(interp, objv[3], &val) ) return TCL_ERROR;
rc = sqlite3_limit(db, id, val);
Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
return TCL_OK;
}
/*
** tclcmd: save_prng_state
*/
@ -4456,6 +4512,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
{ "sqlite3_load_extension", test_load_extension, 0},
{ "sqlite3_enable_load_extension", test_enable_load, 0},
{ "sqlite3_extended_result_codes", test_extended_result_codes, 0},
{ "sqlite3_limit", test_limit, 0},
{ "save_prng_state", save_prng_state, 0 },
{ "restore_prng_state", restore_prng_state, 0 },

View File

@ -12,123 +12,295 @@
# This file contains tests to verify that the limits defined in
# sqlite source file limits.h are enforced.
#
# $Id: sqllimits1.test,v 1.24 2008/01/31 14:54:44 drh Exp $
# $Id: sqllimits1.test,v 1.25 2008/03/20 16:30:18 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
# Test organization:
#
# sqllimits1-1.*: SQLITE_MAX_LENGTH
# sqllimits1-2.*: SQLITE_MAX_SQL_LENGTH
# sqllimits1-3.*: SQLITE_MAX_PAGE_COUNT (and the max_page_count pragma)
# sqllimits1-4.*: SQLITE_MAX_COLUMN
#
#
# sqllimits1-7.*: SQLITE_MAX_FUNCTION_ARG
# sqllimits1-8.*: SQLITE_MAX_ATTACHED
# sqllimits1-9.*: SQLITE_MAX_VARIABLE_NUMBER
# sqllimits1-10.*: SQLITE_MAX_PAGE_SIZE
# sqllimits1-11.*: SQLITE_MAX_LIKE_PATTERN_LENGTH
#
# Todo:
#
# sqllimits1-5.*: SQLITE_MAX_EXPR_DEPTH (sqlite todo)
# sqllimits1-6.*: SQLITE_MAX_VDBE_OP (sqlite todo)
# sqllimits1-12.*: SQLITE_MAX_PAGE_COUNT (sqlite todo)
# Verify that the default per-connection limits are the same as
# the compile-time hard limits.
#
sqlite3 db2 :memory:
do_test sqllimits1-1.1 {
sqlite3_limit db SQLITE_LIMIT_LENGTH -1
} $SQLITE_MAX_LENGTH
do_test sqllimits1-1.2 {
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1
} $SQLITE_MAX_SQL_LENGTH
do_test sqllimits1-1.3 {
sqlite3_limit db SQLITE_LIMIT_COLUMN -1
} $SQLITE_MAX_COLUMN
do_test sqllimits1-1.4 {
sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1
} $SQLITE_MAX_EXPR_DEPTH
do_test sqllimits1-1.5 {
sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1
} $SQLITE_MAX_COMPOUND_SELECT
do_test sqllimits1-1.6 {
sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1
} $SQLITE_MAX_VDBE_OP
do_test sqllimits1-1.7 {
sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1
} $SQLITE_MAX_FUNCTION_ARG
do_test sqllimits1-1.8 {
sqlite3_limit db SQLITE_LIMIT_ATTACHED -1
} $SQLITE_MAX_ATTACHED
do_test sqllimits1-1.9 {
sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1
} $SQLITE_MAX_LIKE_PATTERN_LENGTH
do_test sqllimits1-1.10 {
sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1
} $SQLITE_MAX_VARIABLE_NUMBER
unset -nocomplain saved
foreach var [info vars SQLITE_MAX_*] {
set saved($var) [set $var]
# Decrease all limits by half. Verify that the new limits take.
#
if {$SQLITE_MAX_LENGTH>=2} {
do_test sqllimits1-2.1.1 {
sqlite3_limit db SQLITE_LIMIT_LENGTH \
[expr {$::SQLITE_MAX_LENGTH/2}]
} $SQLITE_MAX_LENGTH
do_test sqllimits1-2.1.2 {
sqlite3_limit db SQLITE_LIMIT_LENGTH -1
} [expr {$SQLITE_MAX_LENGTH/2}]
}
if {$SQLITE_MAX_SQL_LENGTH>=2} {
do_test sqllimits1-2.2.1 {
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH \
[expr {$::SQLITE_MAX_SQL_LENGTH/2}]
} $SQLITE_MAX_SQL_LENGTH
do_test sqllimits1-2.2.2 {
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1
} [expr {$SQLITE_MAX_SQL_LENGTH/2}]
}
if {$SQLITE_MAX_COLUMN>=2} {
do_test sqllimits1-2.3.1 {
sqlite3_limit db SQLITE_LIMIT_COLUMN \
[expr {$::SQLITE_MAX_COLUMN/2}]
} $SQLITE_MAX_COLUMN
do_test sqllimits1-2.3.2 {
sqlite3_limit db SQLITE_LIMIT_COLUMN -1
} [expr {$SQLITE_MAX_COLUMN/2}]
}
if {$SQLITE_MAX_EXPR_DEPTH>=2} {
do_test sqllimits1-2.4.1 {
sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH \
[expr {$::SQLITE_MAX_EXPR_DEPTH/2}]
} $SQLITE_MAX_EXPR_DEPTH
do_test sqllimits1-2.4.2 {
sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1
} [expr {$SQLITE_MAX_EXPR_DEPTH/2}]
}
if {$SQLITE_MAX_COMPOUND_SELECT>=2} {
do_test sqllimits1-2.5.1 {
sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT \
[expr {$::SQLITE_MAX_COMPOUND_SELECT/2}]
} $SQLITE_MAX_COMPOUND_SELECT
do_test sqllimits1-2.5.2 {
sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1
} [expr {$SQLITE_MAX_COMPOUND_SELECT/2}]
}
if {$SQLITE_MAX_VDBE_OP>=2} {
do_test sqllimits1-2.6.1 {
sqlite3_limit db SQLITE_LIMIT_VDBE_OP \
[expr {$::SQLITE_MAX_VDBE_OP/2}]
} $SQLITE_MAX_VDBE_OP
do_test sqllimits1-2.6.2 {
sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1
} [expr {$SQLITE_MAX_VDBE_OP/2}]
}
if {$SQLITE_MAX_FUNCTION_ARG>=2} {
do_test sqllimits1-2.7.1 {
sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG \
[expr {$::SQLITE_MAX_FUNCTION_ARG/2}]
} $SQLITE_MAX_FUNCTION_ARG
do_test sqllimits1-2.7.2 {
sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1
} [expr {$SQLITE_MAX_FUNCTION_ARG/2}]
}
if {$SQLITE_MAX_ATTACHED>=2} {
do_test sqllimits1-2.8.1 {
sqlite3_limit db SQLITE_LIMIT_ATTACHED \
[expr {$::SQLITE_MAX_ATTACHED/2}]
} $SQLITE_MAX_ATTACHED
do_test sqllimits1-2.8.2 {
sqlite3_limit db SQLITE_LIMIT_ATTACHED -1
} [expr {$SQLITE_MAX_ATTACHED/2}]
}
if {$SQLITE_MAX_LIKE_PATTERN_LENGTH>=2} {
do_test sqllimits1-2.9.1 {
sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH \
[expr {$::SQLITE_MAX_LIKE_PATTERN_LENGTH/2}]
} $SQLITE_MAX_LIKE_PATTERN_LENGTH
do_test sqllimits1-2.9.2 {
sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1
} [expr {$SQLITE_MAX_LIKE_PATTERN_LENGTH/2}]
}
if {$SQLITE_MAX_VARIABLE_NUMBER>=2} {
do_test sqllimits1-2.10.1 {
sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER \
[expr {$::SQLITE_MAX_VARIABLE_NUMBER/2}]
} $SQLITE_MAX_VARIABLE_NUMBER
do_test sqllimits1-2.10.2 {
sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1
} [expr {$SQLITE_MAX_VARIABLE_NUMBER/2}]
}
set SQLITE_MAX_LENGTH 100000
set SQLITE_MAX_COLUMN
set SQLITE_MAX_SQL_LENGTH 50000
set SQLITE_MAX_EXPR_DEPTH 1000
set SQLITE_MAX_COMPOUND_SELECT 5
set SQLITE_MAX_VDBE_OP
set SQLITE_MAX_FUNCTION_ARG
set SQLITE_MAX_VARIABLE_NUMBER
set SQLITE_MAX_PAGE_SIZE
set SQLITE_MAX_PAGE_COUNT
set SQLITE_MAX_LIKE_PATTERN_LENGTH 1000
# In a separate database connection, verify that the limits are unchanged.
#
do_test sqllimits1-3.1 {
sqlite3_limit db2 SQLITE_LIMIT_LENGTH -1
} $SQLITE_MAX_LENGTH
do_test sqllimits1-3.2 {
sqlite3_limit db2 SQLITE_LIMIT_SQL_LENGTH -1
} $SQLITE_MAX_SQL_LENGTH
do_test sqllimits1-3.3 {
sqlite3_limit db2 SQLITE_LIMIT_COLUMN -1
} $SQLITE_MAX_COLUMN
do_test sqllimits1-3.4 {
sqlite3_limit db2 SQLITE_LIMIT_EXPR_DEPTH -1
} $SQLITE_MAX_EXPR_DEPTH
do_test sqllimits1-3.5 {
sqlite3_limit db2 SQLITE_LIMIT_COMPOUND_SELECT -1
} $SQLITE_MAX_COMPOUND_SELECT
do_test sqllimits1-3.6 {
sqlite3_limit db2 SQLITE_LIMIT_VDBE_OP -1
} $SQLITE_MAX_VDBE_OP
do_test sqllimits1-3.7 {
sqlite3_limit db2 SQLITE_LIMIT_FUNCTION_ARG -1
} $SQLITE_MAX_FUNCTION_ARG
do_test sqllimits1-3.8 {
sqlite3_limit db2 SQLITE_LIMIT_ATTACHED -1
} $SQLITE_MAX_ATTACHED
do_test sqllimits1-3.9 {
sqlite3_limit db2 SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1
} $SQLITE_MAX_LIKE_PATTERN_LENGTH
do_test sqllimits1-3.10 {
sqlite3_limit db2 SQLITE_LIMIT_VARIABLE_NUMBER -1
} $SQLITE_MAX_VARIABLE_NUMBER
db2 close
# Attempt to set all limits to the maximum 32-bit integer. Verify
# that the limit does not exceed the compile-time upper bound.
#
do_test sqllimits1-4.1.1 {
sqlite3_limit db SQLITE_LIMIT_LENGTH 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_LENGTH -1
} $SQLITE_MAX_LENGTH
do_test sqllimits1-4.2.1 {
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1
} $SQLITE_MAX_SQL_LENGTH
do_test sqllimits1-4.3.1 {
sqlite3_limit db SQLITE_LIMIT_COLUMN 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_COLUMN -1
} $SQLITE_MAX_COLUMN
do_test sqllimits1-4.4.1 {
sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1
} $SQLITE_MAX_EXPR_DEPTH
do_test sqllimits1-4.5.1 {
sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1
} $SQLITE_MAX_COMPOUND_SELECT
do_test sqllimits1-4.6.1 {
sqlite3_limit db SQLITE_LIMIT_VDBE_OP 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1
} $SQLITE_MAX_VDBE_OP
do_test sqllimits1-4.7.1 {
sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1
} $SQLITE_MAX_FUNCTION_ARG
do_test sqllimits1-4.8.1 {
sqlite3_limit db SQLITE_LIMIT_ATTACHED 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_ATTACHED -1
} $SQLITE_MAX_ATTACHED
do_test sqllimits1-4.9.1 {
sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1
} $SQLITE_MAX_LIKE_PATTERN_LENGTH
do_test sqllimits1-4.10.1 {
sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER 0x7fffffff
sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1
} $SQLITE_MAX_VARIABLE_NUMBER
#--------------------------------------------------------------------
# Test cases sqllimits1-1.* test that the SQLITE_MAX_LENGTH limit
# Test cases sqllimits1-5.* test that the SQLITE_MAX_LENGTH limit
# is enforced.
#
do_test sqllimits1-1.1.1 {
db close
sqlite3 db test.db
set LARGESIZE 99999
set SQLITE_LIMIT_LENGTH 100000
sqlite3_limit db SQLITE_LIMIT_LENGTH $SQLITE_LIMIT_LENGTH
do_test sqllimits1-5.1.1 {
catchsql { SELECT randomblob(2147483647) }
} {1 {string or blob too big}}
do_test sqllimits1-1.1.2 {
do_test sqllimits1-5.1.2 {
catchsql { SELECT zeroblob(2147483647) }
} {1 {string or blob too big}}
# Large, but allowable, blob-size.
#
set ::LARGESIZE [expr $SQLITE_MAX_LENGTH - 1]
do_test sqllimits1-1.2 {
do_test sqllimits1-5.2 {
catchsql { SELECT LENGTH(randomblob($::LARGESIZE)) }
} "0 $::LARGESIZE"
} [list 0 $LARGESIZE]
do_test sqllimits1-1.3 {
do_test sqllimits1-5.3 {
catchsql { SELECT quote(randomblob($::LARGESIZE)) }
} {1 {string or blob too big}}
do_test sqllimits1-1.4 {
do_test sqllimits1-5.4 {
catchsql { SELECT LENGTH(zeroblob($::LARGESIZE)) }
} "0 $::LARGESIZE"
} [list 0 $LARGESIZE]
do_test sqllimits1-1.5 {
do_test sqllimits1-5.5 {
catchsql { SELECT quote(zeroblob($::LARGESIZE)) }
} {1 {string or blob too big}}
do_test sqllimits1-1.6 {
do_test sqllimits1-5.6 {
catchsql { SELECT zeroblob(-1) }
} {0 {{}}}
do_test sqllimits1-1.9 {
do_test sqllimits1-5.9 {
set ::str [string repeat A 65537]
set ::rep [string repeat B 65537]
catchsql { SELECT replace($::str, 'A', $::rep) }
} {1 {string or blob too big}}
do_test sqllimits1-1.10 {
do_test sqllimits1-5.10 {
set ::str [string repeat %J 2100]
catchsql { SELECT strftime($::str, '2003-10-31') }
} {1 {string or blob too big}}
do_test sqllimits1-1.11 {
set ::str1 [string repeat A [expr {$SQLITE_MAX_LENGTH - 10}]]
set ::str2 [string repeat B [expr {$SQLITE_MAX_LENGTH - 10}]]
do_test sqllimits1-5.11 {
set ::str1 [string repeat A [expr {$SQLITE_LIMIT_LENGTH - 10}]]
set ::str2 [string repeat B [expr {$SQLITE_LIMIT_LENGTH - 10}]]
catchsql { SELECT $::str1 || $::str2 }
} {1 {string or blob too big}}
do_test sqllimits1-1.12 {
set ::str1 [string repeat ' [expr {$SQLITE_MAX_LENGTH - 10}]]
do_test sqllimits1-5.12 {
set ::str1 [string repeat ' [expr {$SQLITE_LIMIT_LENGTH - 10}]]
catchsql { SELECT quote($::str1) }
} {1 {string or blob too big}}
do_test sqllimits1-1.13 {
set ::str1 [string repeat ' [expr {$SQLITE_MAX_LENGTH - 10}]]
do_test sqllimits1-5.13 {
set ::str1 [string repeat ' [expr {$SQLITE_LIMIT_LENGTH - 10}]]
catchsql { SELECT hex($::str1) }
} {1 {string or blob too big}}
do_test sqllimits1-1.14.1 {
do_test sqllimits1-5.14.1 {
set ::STMT [sqlite3_prepare $::DB "SELECT ?" -1 TAIL]
sqlite3_bind_zeroblob $::STMT 1 [expr {$SQLITE_MAX_LENGTH + 1}]
sqlite3_bind_zeroblob $::STMT 1 [expr {$SQLITE_LIMIT_LENGTH + 1}]
} {}
do_test sqllimits1-1.14.2 {
do_test sqllimits1-5.14.2 {
sqlite3_step $::STMT
} {SQLITE_ERROR}
do_test sqllimits1-1.14.3 {
do_test sqllimits1-5.14.3 {
sqlite3_finalize $::STMT
} {SQLITE_TOOBIG}
do_test sqllimits1-1.15 {
do_test sqllimits1-5.15 {
execsql {
CREATE TABLE t4(x);
INSERT INTO t4 VALUES(1);
@ -141,80 +313,79 @@ do_test sqllimits1-1.15 {
} {1 {string or blob too big}}
db eval {DROP TABLE t4}
set ::SQLITE_MAX_SQL_LENGTH 0
set strvalue [string repeat A $::SQLITE_MAX_LENGTH]
do_test sqllimits1-1.16 {
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0x7fffffff
set strvalue [string repeat A $::SQLITE_LIMIT_LENGTH]
do_test sqllimits1-5.16 {
catchsql "SELECT '$strvalue'"
} [list 0 $strvalue]
do_test sqllimits1-1.17 {
do_test sqllimits1-5.17 {
catchsql "SELECT 'A$strvalue'"
} [list 1 {string or blob too big}]
set blobvalue [string repeat 41 $::SQLITE_MAX_LENGTH]
do_test sqllimits1-1.18 {
set blobvalue [string repeat 41 $::SQLITE_LIMIT_LENGTH]
do_test sqllimits1-5.18 {
catchsql "SELECT x'$blobvalue'"
} [list 0 $strvalue]
do_test sqllimits1-1.19 {
do_test sqllimits1-5.19 {
catchsql "SELECT '41$blobvalue'"
} [list 1 {string or blob too big}]
unset blobvalue
ifcapable datetime {
set strvalue [string repeat D [expr {$SQLITE_MAX_LENGTH-12}]]
do_test sqllimits1-1.20 {
set strvalue [string repeat D [expr {$SQLITE_LIMIT_LENGTH-12}]]
do_test sqllimits1-5.20 {
catchsql {SELECT strftime('%Y ' || $::strvalue, '2008-01-02')}
} [list 0 [list "2008 $strvalue"]]
do_test sqllimits1-1.21 {
do_test sqllimits1-5.21 {
catchsql {SELECT strftime('%Y-%m-%d ' || $::strvalue, '2008-01-02')}
} {1 {string or blob too big}}
}
unset strvalue
#--------------------------------------------------------------------
# Test cases sqllimits1-2.* test that the SQLITE_MAX_SQL_LENGTH limit
# Test cases sqllimits1-6.* test that the SQLITE_MAX_SQL_LENGTH limit
# is enforced.
#
do_test sqllimits1-2.1 {
set ::SQLITE_MAX_SQL_LENGTH 50000
do_test sqllimits1-6.1 {
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000
set sql "SELECT 1 WHERE 1==1"
set tail " /* A comment to take up space in order to make the string\
longer without increasing the expression depth */\
AND 1 == 1"
set N [expr {($::SQLITE_MAX_SQL_LENGTH / [string length $tail])+1}]
set N [expr {(50000 / [string length $tail])+1}]
append sql [string repeat $tail $N]
catchsql $sql
} {1 {String or BLOB exceeded size limit}}
do_test sqllimits1-2.2 {
set ::SQLITE_MAX_SQL_LENGTH 0
do_test sqllimits1-6.2 {
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0
catchsql $sql
} {0 1}
do_test sqllimits1-2.3 {
set ::SQLITE_MAX_SQL_LENGTH 50000
do_test sqllimits1-6.3 {
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000
set sql "SELECT 1 WHERE 1==1"
set tail " /* A comment to take up space in order to make the string\
longer without increasing the expression depth */\
AND 1 == 1"
set N [expr {($::SQLITE_MAX_SQL_LENGTH / [string length $tail])+1}]
set N [expr {(50000 / [string length $tail])+1}]
append sql [string repeat $tail $N]
set nbytes [string length $sql]
append sql { AND 0}
set rc [catch {sqlite3_prepare $DB $sql $nbytes TAIL} STMT]
lappend rc $STMT
} {1 {(18) statement too long}}
do_test sqllimits1-2.4 {
do_test sqllimits1-6.4 {
sqlite3_errmsg $DB
} {statement too long}
#--------------------------------------------------------------------
# Test cases sqllimits1-3.* test that the limit set using the
# Test cases sqllimits1-7.* test that the limit set using the
# max_page_count pragma.
#
do_test sqllimits1-3.1 {
do_test sqllimits1-7.1 {
execsql {
PRAGMA max_page_count = 1000;
}
} {1000}
do_test sqllimits1-3.2 {
do_test sqllimits1-7.2 {
execsql { CREATE TABLE trig (a INTEGER, b INTEGER); }
# Set up a tree of triggers to fire when a row is inserted
@ -261,13 +432,13 @@ do_test sqllimits1-3.2 {
}
} {}
do_test sqllimits1-3.3 {
do_test sqllimits1-7.3 {
execsql {
INSERT INTO trig VALUES (1,1);
}
} {}
do_test sqllimits1-3.4 {
do_test sqllimits1-7.4 {
execsql {
SELECT COUNT(*) FROM trig;
}
@ -276,13 +447,13 @@ do_test sqllimits1-3.4 {
# This tries to insert so many rows it fills up the database (limited
# to 1MB, so not that noteworthy an achievement).
#
do_test sqllimits1-3.5 {
do_test sqllimits1-7.5 {
catchsql {
INSERT INTO trig VALUES (1,10);
}
} {1 {database or disk is full}}
do_test sqllimits1-3.6 {
do_test sqllimits1-7.6 {
catchsql {
SELECT COUNT(*) FROM trig;
}
@ -296,7 +467,7 @@ if {[db eval {PRAGMA auto_vacuum}]} {
} else {
set fsize 1691
}
do_test sqllimits1-3.7.1 {
do_test sqllimits1-7.7.1 {
execsql {
PRAGMA max_page_count = 1000000;
CREATE TABLE abc(a, b, c);
@ -315,7 +486,7 @@ do_test sqllimits1-3.7.1 {
}
expr [file size test.db] / 1024
} $fsize
do_test sqllimits1-3.7.2 {
do_test sqllimits1-7.7.2 {
db close
sqlite3 db test.db
execsql {
@ -325,51 +496,53 @@ do_test sqllimits1-3.7.2 {
SELECT count(*) FROM sqlite_master;
}
} {6}
do_test sqllimits1-3.7.3 {
do_test sqllimits1-7.7.3 {
execsql {
PRAGMA max_page_count;
}
} $fsize
do_test sqllimits1-3.7.4 {
do_test sqllimits1-7.7.4 {
execsql {
DROP TABLE abc;
}
} {}
#--------------------------------------------------------------------
# Test cases sqllimits1-4.* test the SQLITE_MAX_COLUMN limit.
# Test cases sqllimits1-8.* test the SQLITE_MAX_COLUMN limit.
#
do_test sqllimits1-4.1 {
set SQLITE_LIMIT_COLUMN 200
sqlite3_limit db SQLITE_LIMIT_COLUMN $SQLITE_LIMIT_COLUMN
do_test sqllimits1-8.1 {
# Columns in a table.
set cols [list]
for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} {
for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
lappend cols "c$i"
}
catchsql "CREATE TABLE t([join $cols ,])"
} {1 {too many columns on t}}
do_test sqllimits1-4.2 {
do_test sqllimits1-8.2 {
# Columns in the result-set of a SELECT.
set cols [list]
for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} {
for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
lappend cols "sql AS sql$i"
}
catchsql "SELECT [join $cols ,] FROM sqlite_master"
} {1 {too many columns in result set}}
do_test sqllimits1-4.3 {
do_test sqllimits1-8.3 {
# Columns in the result-set of a sub-SELECT.
set cols [list]
for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} {
for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
lappend cols "sql AS sql$i"
}
catchsql "SELECT sql4 FROM (SELECT [join $cols ,] FROM sqlite_master)"
} {1 {too many columns in result set}}
do_test sqllimits1-4.4 {
do_test sqllimits1-8.4 {
# Columns in an index.
set cols [list]
for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} {
for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
lappend cols c
}
set sql1 "CREATE TABLE t1(c);"
@ -377,38 +550,38 @@ do_test sqllimits1-4.4 {
catchsql "$sql1 ; $sql2"
} {1 {too many columns in index}}
do_test sqllimits1-4.5 {
do_test sqllimits1-8.5 {
# Columns in a GROUP BY clause.
catchsql "SELECT * FROM t1 GROUP BY [join $cols ,]"
} {1 {too many terms in GROUP BY clause}}
do_test sqllimits1-4.6 {
do_test sqllimits1-8.6 {
# Columns in an ORDER BY clause.
catchsql "SELECT * FROM t1 ORDER BY [join $cols ,]"
} {1 {too many terms in ORDER BY clause}}
do_test sqllimits1-4.7 {
do_test sqllimits1-8.7 {
# Assignments in an UPDATE statement.
set cols [list]
for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} {
for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
lappend cols "c = 1"
}
catchsql "UPDATE t1 SET [join $cols ,];"
} {1 {too many columns in set list}}
do_test sqllimits1-4.8 {
do_test sqllimits1-8.8 {
# Columns in a view definition:
set cols [list]
for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} {
for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
lappend cols "c$i"
}
catchsql "CREATE VIEW v1 AS SELECT [join $cols ,] FROM t1;"
} {1 {too many columns in result set}}
do_test sqllimits1-4.9 {
do_test sqllimits1-8.9 {
# Columns in a view definition (testing * expansion):
set cols [list]
for {set i 0} {$i < $SQLITE_MAX_COLUMN} {incr i} {
for {set i 0} {$i < $SQLITE_LIMIT_COLUMN} {incr i} {
lappend cols "c$i"
}
catchsql "CREATE TABLE t2([join $cols ,])"
@ -416,15 +589,15 @@ do_test sqllimits1-4.9 {
} {1 {too many columns in result set}}
#--------------------------------------------------------------------
# These tests - sqllimits1-5.* - test that the SQLITE_MAX_EXPR_DEPTH
# These tests - sqllimits1-9.* - test that the SQLITE_LIMIT_EXPR_DEPTH
# limit is enforced. The limit refers to the number of terms in
# the expression.
#
if {$::SQLITE_MAX_EXPR_DEPTH != 1000} {
if {$SQLITE_MAX_EXPR_DEPTH==0} {
puts -nonewline stderr "WARNING: Compile with -DSQLITE_MAX_EXPR_DEPTH to run "
puts stderr "tests sqllimits1-5.X"
puts stderr "tests sqllimits1-9.X"
} else {
do_test sqllimits1-5.1 {
do_test sqllimits1-9.1 {
set max $::SQLITE_MAX_EXPR_DEPTH
set expr "(1 [string repeat {AND 1 } $max])"
catchsql [subst {
@ -434,7 +607,7 @@ if {$::SQLITE_MAX_EXPR_DEPTH != 1000} {
# Attempting to beat the expression depth limit using nested SELECT
# queries causes a parser stack overflow.
do_test sqllimits1-5.2 {
do_test sqllimits1-9.2 {
set max $::SQLITE_MAX_EXPR_DEPTH
set expr "SELECT 1"
for {set i 0} {$i <= $max} {incr i} {
@ -444,7 +617,7 @@ if {$::SQLITE_MAX_EXPR_DEPTH != 1000} {
} "1 {parser stack overflow}"
do_test sqllimits1-5.3 {
do_test sqllimits1-9.3 {
execsql {
PRAGMA max_page_count = 1000000; -- 1 GB
CREATE TABLE v0(a);
@ -460,7 +633,7 @@ if {$::SQLITE_MAX_EXPR_DEPTH != 1000} {
}
} {}
do_test sqllimits1-5.4 {
do_test sqllimits1-9.4 {
catchsql {
SELECT a FROM v199
}
@ -468,17 +641,17 @@ if {$::SQLITE_MAX_EXPR_DEPTH != 1000} {
}
#--------------------------------------------------------------------
# Test cases sqllimits1-6.* test that the SQLITE_MAX_VDBE_OP
# Test cases sqllimits1-10.* test that the SQLITE_MAX_VDBE_OP
# limit works as expected. The limit refers to the number of opcodes
# in a single VDBE program.
#
# TODO
#--------------------------------------------------------------------
# Test the SQLITE_MAX_FUNCTION_ARG limit works. Test case names
# match the pattern "sqllimits1-7.*".
# Test the SQLITE_LIMIT_FUNCTION_ARG limit works. Test case names
# match the pattern "sqllimits1-11.*".
#
do_test sqllimits1-7.1 {
do_test sqllimits1-11.1 {
set max $::SQLITE_MAX_FUNCTION_ARG
set vals [list]
for {set i 0} {$i < $SQLITE_MAX_FUNCTION_ARG} {incr i} {
@ -486,7 +659,7 @@ do_test sqllimits1-7.1 {
}
catchsql "SELECT max([join $vals ,])"
} "0 [expr {$::SQLITE_MAX_FUNCTION_ARG - 1}]"
do_test sqllimits1-7.2 {
do_test sqllimits1-11.2 {
set max $::SQLITE_MAX_FUNCTION_ARG
set vals [list]
for {set i 0} {$i <= $SQLITE_MAX_FUNCTION_ARG} {incr i} {
@ -498,7 +671,7 @@ do_test sqllimits1-7.2 {
# Test that it is SQLite, and not the implementation of the
# user function that is throwing the error.
proc myfunc {args} {error "I don't like to be called!"}
do_test sqllimits1-7.2 {
do_test sqllimits1-11.2 {
db function myfunc myfunc
set max $::SQLITE_MAX_FUNCTION_ARG
set vals [list]
@ -508,11 +681,12 @@ do_test sqllimits1-7.2 {
catchsql "SELECT myfunc([join $vals ,])"
} {1 {too many arguments on function myfunc}}
#--------------------------------------------------------------------
# Test cases sqllimits1-8.*: Test the SQLITE_MAX_ATTACHED limit.
# Test cases sqllimits1-12.*: Test the SQLITE_MAX_ATTACHED limit.
#
ifcapable attach {
do_test sqllimits1-8.1 {
do_test sqllimits1-12.1 {
set max $::SQLITE_MAX_ATTACHED
for {set i 0} {$i < ($max)} {incr i} {
file delete -force test${i}.db test${i}.db-journal
@ -522,7 +696,7 @@ ifcapable attach {
}
catchsql "ATTACH 'test${i}.db' AS aux${i}"
} "1 {too many attached databases - max $::SQLITE_MAX_ATTACHED}"
do_test sqllimits1-8.2 {
do_test sqllimits1-12.2 {
set max $::SQLITE_MAX_ATTACHED
for {set i 0} {$i < ($max)} {incr i} {
execsql "DETACH aux${i}"
@ -531,14 +705,14 @@ ifcapable attach {
}
#--------------------------------------------------------------------
# Test cases sqllimits1-9.*: Check that the SQLITE_MAX_VARIABLE_NUMBER
# Test cases sqllimits1-13.*: Check that the SQLITE_MAX_VARIABLE_NUMBER
# limit works.
#
do_test sqllimits1-9.1 {
do_test sqllimits1-13.1 {
set max $::SQLITE_MAX_VARIABLE_NUMBER
catchsql "SELECT ?[expr {$max+1}] FROM t1"
} "1 {variable number must be between ?1 and ?$::SQLITE_MAX_VARIABLE_NUMBER}"
do_test sqllimits1-9.2 {
do_test sqllimits1-13.2 {
set max $::SQLITE_MAX_VARIABLE_NUMBER
set vals [list]
for {set i 0} {$i < ($max+3)} {incr i} {
@ -549,57 +723,7 @@ do_test sqllimits1-9.2 {
#--------------------------------------------------------------------
# sqllimits1-10.*: Test the SQLITE_MAX_PAGE_SIZE define is enforced.
# This is probably tested elsewhere too (pagerX.test). Attempts
# to raise the page size above this limit are silently ignored.
#
do_test sqllimits1-10.1 {
db close
file delete -force test.db test.db-journal
sqlite3 db test.db
set max $::SQLITE_MAX_PAGE_SIZE
catchsql "PRAGMA page_size = [expr {$max*2}]"
} {0 {}}
do_test sqllimits1-10.2 {
catchsql "PRAGMA page_size"
} {0 1024}
do_test sqllimits1-10.3 {
set max $::SQLITE_MAX_PAGE_SIZE
catchsql "PRAGMA page_size = $max"
} {0 {}}
do_test sqllimits1-10.4 {
execsql "pragma page_size"
} $::SQLITE_MAX_PAGE_SIZE
do_test sqllimits1-10.5 {
set max $::SQLITE_MAX_PAGE_SIZE
execsql "pragma page_size = [expr {$max - 5}]"
execsql "pragma page_size"
} $::SQLITE_MAX_PAGE_SIZE
# Opening a database where the page size is too large should generate
# an error.
#
do_test sqllimits1-10.5 {
db close
file delete -force test.db
set ::SQLITE_MAX_PAGE_SIZE 32768
sqlite3 db test.db
db eval {PRAGMA page_size=32768}
db eval {CREATE TABLE t1(x);}
db eval {PRAGMA page_size}
} {32768}
do_test sqllimits1-10.6 {
db close
set ::SQLITE_MAX_PAGE_SIZE 8192
sqlite3 db test.db
catchsql {SELECT name FROM sqlite_master}
} {1 {file is encrypted or is not a database}}
db close
file delete -force test.db
sqlite3 db test.db
#--------------------------------------------------------------------
# Test cases sqllimits1-11.* verify that the
# Test cases sqllimits1-15.* verify that the
# SQLITE_MAX_LIKE_PATTERN_LENGTH limit is enforced. This limit only
# applies to the built-in LIKE operator, supplying an external
# implementation by overriding the like() scalar function bypasses
@ -609,16 +733,18 @@ sqlite3 db test.db
# the left-hand-side of the LIKE operator (the string being tested
# against the pattern).
#
do_test sqllimits1-11.1 {
set max $::SQLITE_MAX_LIKE_PATTERN_LENGTH
set SQLITE_LIMIT_LIKE_PATTERN 1000
sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH $SQLITE_LIMIT_LIKE_PATTERN
do_test sqllimits1-15.1 {
set max $::SQLITE_LIMIT_LIKE_PATTERN
set ::pattern [string repeat "A%" [expr $max/2]]
set ::string [string repeat "A" [expr {$max*2}]]
execsql {
SELECT $::string LIKE $::pattern;
}
} {1}
do_test sqllimits1-11.2 {
set max $::SQLITE_MAX_LIKE_PATTERN_LENGTH
do_test sqllimits1-15.2 {
set max $::SQLITE_LIMIT_LIKE_PATTERN
set ::pattern [string repeat "A%" [expr {($max/2) + 1}]]
set ::string [string repeat "A" [expr {$max*2}]]
catchsql {
@ -630,11 +756,11 @@ do_test sqllimits1-11.2 {
# This test case doesn't really belong with the other limits tests.
# It is in this file because it is taxing to run, like the limits tests.
#
do_test sqllimits1-12.1 {
do_test sqllimits1-16.1 {
set ::N [expr int(([expr pow(2,32)]/50) + 1)]
expr (($::N*50) & 0xffffffff)<55
} {1}
do_test sqllimits1-12.2 {
do_test sqllimits1-16.2 {
set ::format "[string repeat A 60][string repeat "%J" $::N]"
catchsql {
SELECT strftime($::format, 1);