Make the distinction between text and numeric data. (CVS 710)
FossilOrigin-Name: 310ac4fbaf0ed63f98bfacb55259960be03b0c8b
This commit is contained in:
parent
76800328b2
commit
a9e99aee95
40
manifest
40
manifest
@ -1,9 +1,9 @@
|
||||
C Documentation\sand\smakefile\supdates.\s(CVS\s709)
|
||||
D 2002-08-13T20:45:40
|
||||
C Make\sthe\sdistinction\sbetween\stext\sand\snumeric\sdata.\s(CVS\s710)
|
||||
D 2002-08-13T23:02:57
|
||||
F Makefile.in 6291a33b87d2a395aafd7646ee1ed562c6f2c28c
|
||||
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
||||
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
||||
F VERSION f860323f95b110e5af69b3754d006f39304390a0
|
||||
F VERSION a8c86d12b1459b66b47ef640f3f0c87822c25901
|
||||
F aclocal.m4 11faa843caa38fd451bc6aeb43e248d1723a269d
|
||||
F config.guess f38b1e93d1e0fa6f5a6913e9e7b12774b9232588
|
||||
F config.sub f14b07d544ca26b5d698259045136b783e18fc7f
|
||||
@ -28,7 +28,7 @@ F src/func.c e45cd908b9b723d9b91473d09e12c23f786b3fc2
|
||||
F src/hash.c 6a6236b89c8c060c65dabd300a1c8ce7c10edb72
|
||||
F src/hash.h cd0433998bc1a3759d244e1637fe5a3c13b53bf8
|
||||
F src/insert.c 8aefc998c86a3bd53082e2f8fdd049345fcf3463
|
||||
F src/main.c 69f85a56200df5f5ce24ba38b6590d2a9c9f542b
|
||||
F src/main.c c7e313ef70d7e4339a6d8ba1deb31f7b51a3473d
|
||||
F src/md5.c 0ae1f3e2cac92d06fc6246d1b4b8f61a2fe66d3b
|
||||
F src/os.c 9665974085ebe1d40d56d1145045b3d64f12cbce
|
||||
F src/os.h 4a361fccfbc4e7609b3e1557f604f94c1e96ad10
|
||||
@ -51,10 +51,10 @@ F src/threadtest.c 72bce0a284647314847bbea44616ceb056bfb77f
|
||||
F src/tokenize.c b5500e193a82b5b9888fbf947efd90d3b4858178
|
||||
F src/trigger.c d88ab4d68d68955c217b38fb6717e090fbbf54a4
|
||||
F src/update.c f07e6ed2c517c92871e54d3f5886d1cf56121b11
|
||||
F src/util.c 7a99e754c44dd220e881122e30581c08b6d6adef
|
||||
F src/vdbe.c aa647946d08e54b71bfff9049ad31135b7af4a8e
|
||||
F src/util.c bdbf0aedcec21ede2248126bbbe734bcc070b7c8
|
||||
F src/vdbe.c aad57e622827dc864529f1609a8e94240d4ed92a
|
||||
F src/vdbe.h a9292f2b5fcecef924fa255fb74609e9cbc776c2
|
||||
F src/where.c c250b91886f820d88cfa7eed8f79a9ef24e4b2bb
|
||||
F src/where.c 9a6d2783cabead68a2b9e857521b0b841f2c1d55
|
||||
F test/all.test 9a6eb262393f74cb7fb09b17156491a34b941fe3
|
||||
F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578
|
||||
F test/btree.test bf326f546a666617367a7033fa2c07451bd4f8e1
|
||||
@ -63,21 +63,21 @@ F test/btree3.test 9caa9e22491dd8cd8aa36d7ac3b48b089817c895
|
||||
F test/conflict.test 4518cc3c1c40c4ba74220d9ee814257ae7d09c47
|
||||
F test/copy.test 55d60a4d5ed342a0fa08b7cd07d46d43ea0d0d7f
|
||||
F test/delete.test 5821a95a66061ae09723a88938f23d10d8a881ad
|
||||
F test/expr.test 5fadd0bc87c223b424ce6752b576c1df346abf1f
|
||||
F test/func.test cae5f27e09736cfdcc978c3719ac1345405b848c
|
||||
F test/expr.test 565feb81bd39f703d4f9f9fa3534f05fae5094fe
|
||||
F test/func.test bed7ae7a3482df05db0f5eed2debdf25ac2d07fc
|
||||
F test/in.test e59461f1702b7387880bf08a0ce6bb777925d282
|
||||
F test/index.test 7503d903c4dffecbb415010298720720db8618e0
|
||||
F test/index.test 2a5a1b654f50ca0768fb10ae44b72e6a776b1f18
|
||||
F test/insert.test a122afb86911e77c181d912348866a5b1a61eeab
|
||||
F test/insert2.test c288375a64dad3295044714f0dfed4a193cf067f
|
||||
F test/intpkey.test 69a6a9b41e541f27a2ffcd20264fb35adc3c2680
|
||||
F test/ioerr.test 57d9bffaca18b34f9e976f786eadc2591d6efc6a
|
||||
F test/join.test 90a620f2a2d015e5139d5a4cde0eeb4cf62523bf
|
||||
F test/limit.test 49b44e027a002c0ba336d723b448f07e05b04466
|
||||
F test/limit.test dd932f7572fe78e82ef621ef62f0cc480c7e541e
|
||||
F test/lock.test f1b55dc61632e99d241643cc8e7c03774f09f623
|
||||
F test/main.test c66b564554b770ee7fdbf6a66c0cd90329bc2c85
|
||||
F test/malloc.test 7ba32a9ebd3aeed52ae4aaa6d42ca37e444536fd
|
||||
F test/minmax.test 29bc5727c3e4c792d5c4745833dd4b505905819e
|
||||
F test/misc1.test eb47435bb2d9417f72afdb673d1883b9d783cf6b
|
||||
F test/misc1.test 064d7fbbe41285a381ce21832fed41ed245a6a2e
|
||||
F test/misuse.test a3aa2b18a97e4c409a1fcaff5151a4dd804a0162
|
||||
F test/notnull.test b1f3e42fc475b0b5827b27b2e9b562081995ff30
|
||||
F test/null.test 5c2b57307e4b6178aae825eb65ddbee01e76b0fd
|
||||
@ -93,9 +93,9 @@ F test/select3.test 3e98cec10e755226cbabdd7073ec37baab9ab148
|
||||
F test/select4.test 10ba54f24ef6ca7958a7045b001079378db2370c
|
||||
F test/select5.test c2a6c4a003316ee42cbbd689eebef8fdce0db2ac
|
||||
F test/select6.test efb8d0c07a440441db87db2c4ade6904e1407e85
|
||||
F test/sort.test 3b996ce7ca385f9cd559944ac0f4027a23aa546b
|
||||
F test/sort.test 742c07bda828eb16c95f3b1e83fdaea2c0d939b2
|
||||
F test/subselect.test f0fea8cf9f386d416d64d152e3c65f9116d0f50f
|
||||
F test/table.test bc571115def9be8adab6df93aca0b0c05c007eea
|
||||
F test/table.test dedb4d3a73340d811e309672ca14537daa542fb1
|
||||
F test/tableapi.test 3c80421a889e1d106df16e5800fa787f0d2914a6
|
||||
F test/tclsqlite.test 6f4b9760681c7dbca52a18d0ab46a1679cdc79b9
|
||||
F test/temptable.test 9ed7ec0288f887e132de66d90c428ad109105f67
|
||||
@ -108,7 +108,7 @@ F test/trigger4.test 9a5c1406344d743020c2753ae8d6dfe6eb75f818
|
||||
F test/unique.test 572aa791327c1e8d797932263e9d67f176cfdb44
|
||||
F test/update.test 7ffb062d580a972e7870d0f51d5af3ab9bfeae08
|
||||
F test/vacuum.test 059871b312eb910bbe49dafde1d01490cc2c6bbe
|
||||
F test/version.test f6a264303faba43a865714072d49f8d44c69e274
|
||||
F test/version.test c7057526e14c7e3da5718b88e7f566f4182fd5c5
|
||||
F test/view.test 3afca084dab44c7a5772d3c6a326adf93ad52050
|
||||
F test/where.test 1f87bec674bf85d74ac1cc5b2cd3d89be1e87b1d
|
||||
F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b
|
||||
@ -128,13 +128,13 @@ F www/arch.png 82ef36db1143828a7abc88b1e308a5f55d4336f4
|
||||
F www/arch.tcl 679a0c48817f71bc91d5911ef386e5ef35d4f178
|
||||
F www/audit.tcl 90e09d580f79c7efec0c7d6f447b7ec5c2dce5c0
|
||||
F www/c_interface.tcl fb87b825b9032b9aa941694c5c9c5aee9424467e
|
||||
F www/changes.tcl 73451195af83332eff90feea6a61639ff9908155
|
||||
F www/changes.tcl df6f06b1aa97ef285c744bf19ec3efddf707b05f
|
||||
F www/conflict.tcl 81dd21f9a679e60aae049e9dd8ab53d59570cda2
|
||||
F www/crosscompile.tcl 3622ebbe518927a3854a12de51344673eb2dd060
|
||||
F www/download.tcl 29aa6679ca29621d10613f60ebbbda18f4b91c49
|
||||
F www/dynload.tcl 02eb8273aa78cfa9070dd4501dca937fb22b466c
|
||||
F www/faq.tcl e5a752ff431a8408ae24a91ab88ded2dfe699e16
|
||||
F www/formatchng.tcl 502847353450adaf76d187d87374bce20dd07e0e
|
||||
F www/formatchng.tcl b4449e065d2da38b6563bdf12cf46cfe1d4d765e
|
||||
F www/index.tcl 47945cc79706e9f2caf797330412c112d54ad72b
|
||||
F www/lang.tcl 8c3d0bda030f110c754b5edbad75eddf5dbe2ed1
|
||||
F www/mingw.tcl f1c7c0a7f53387dd9bb4f8c7e8571b7561510ebc
|
||||
@ -143,7 +143,7 @@ F www/speed.tcl 7fc83f1b018e1ecc451838449542c3079ed12425
|
||||
F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
|
||||
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
|
||||
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
|
||||
P f9d3d4c1230a7f1176b2002d72e94857e251c04e
|
||||
R d02766c7d8bb513006dc1e531944f320
|
||||
P 92c403f485390bbd83a5be472e61c974f76d46b1
|
||||
R 4eff7fd5f3310391432b7a4cfb68c2be
|
||||
U drh
|
||||
Z ee2dcaa9cadd52a5fbd5a9424f9bf06e
|
||||
Z 8efada5c2bc32cebfca6eea0d127d8d7
|
||||
|
@ -1 +1 @@
|
||||
92c403f485390bbd83a5be472e61c974f76d46b1
|
||||
310ac4fbaf0ed63f98bfacb55259960be03b0c8b
|
@ -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.96 2002/08/13 20:45:41 drh Exp $
|
||||
** $Id: main.c,v 1.97 2002/08/13 23:02:57 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "os.h"
|
||||
@ -280,8 +280,8 @@ int sqliteInit(sqlite *db, char **pzErrMsg){
|
||||
*/
|
||||
if( db->file_format==0 ){
|
||||
/* This happens if the database was initially empty */
|
||||
db->file_format = 3;
|
||||
}else if( db->file_format>3 ){
|
||||
db->file_format = 4;
|
||||
}else if( db->file_format>4 ){
|
||||
sqliteBtreeCloseCursor(curMain);
|
||||
sqliteSetString(pzErrMsg, "unsupported file format", 0);
|
||||
return SQLITE_ERROR;
|
||||
@ -405,7 +405,7 @@ sqlite *sqlite_open(const char *zFilename, int mode, char **pzErrMsg){
|
||||
&zErr);
|
||||
if( rc==SQLITE_OK ){
|
||||
sqliteBtreeGetMeta(db->pBe, meta);
|
||||
meta[2] = 3;
|
||||
meta[2] = 4;
|
||||
sqliteBtreeUpdateMeta(db->pBe, meta);
|
||||
sqlite_exec(db, "COMMIT", 0, 0, 0);
|
||||
}
|
||||
|
66
src/util.c
66
src/util.c
@ -14,7 +14,7 @@
|
||||
** This file contains functions for allocating memory, comparing
|
||||
** strings, and stuff like that.
|
||||
**
|
||||
** $Id: util.c,v 1.47 2002/07/05 21:42:37 drh Exp $
|
||||
** $Id: util.c,v 1.48 2002/08/13 23:02:57 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include <stdarg.h>
|
||||
@ -443,6 +443,7 @@ int sqliteStrNICmp(const char *zLeft, const char *zRight, int N){
|
||||
return N<0 ? 0 : *a - *b;
|
||||
}
|
||||
|
||||
#if 0 /* NOT USED */
|
||||
/*
|
||||
** The sortStrCmp() function below is used to order elements according
|
||||
** to the ORDER BY clause of a SELECT. The sort order is a little different
|
||||
@ -622,6 +623,7 @@ static int sortStrCmp(const char *atext, const char *btext, int useCase){
|
||||
}
|
||||
return result;
|
||||
}
|
||||
#endif /* NOT USED */
|
||||
|
||||
/*
|
||||
** Return TRUE if z is a pure numeric string. Return FALSE if the
|
||||
@ -651,15 +653,17 @@ static int sqliteIsNumber(const char *z){
|
||||
}
|
||||
|
||||
/* This comparison routine is what we use for comparison operations
|
||||
** in an SQL expression. (Ex: name<'Hello' or value<5).
|
||||
** between numeric values in an SQL expression. "Numeric" is a little
|
||||
** bit misleading here. What we mean is that the strings have a
|
||||
** type of "numeric" from the point of view of SQL. The strings
|
||||
** do not necessarily contain numbers. They could contain text.
|
||||
**
|
||||
** Numerical strings compare in numerical order. Numerical strings
|
||||
** are always less than non-numeric strings. Non-numeric strings
|
||||
** compare in lexigraphical order (the same order as strcmp()).
|
||||
**
|
||||
** This is NOT the comparison function used for sorting. The sort
|
||||
** order is a little bit different. See sqliteSortCompare below
|
||||
** for additional information.
|
||||
** If the input strings both look like actual numbers then they
|
||||
** compare in numerical order. Numerical strings are always less
|
||||
** than non-numeric strings so if one input string looks like a
|
||||
** number and the other does not, then the one that looks like
|
||||
** a number is the smaller. Non-numeric strings compare in
|
||||
** lexigraphical order (the same order as strcmp()).
|
||||
*/
|
||||
int sqliteCompare(const char *atext, const char *btext){
|
||||
int result;
|
||||
@ -696,16 +700,16 @@ int sqliteCompare(const char *atext, const char *btext){
|
||||
|
||||
/*
|
||||
** This routine is used for sorting. Each key is a list of one or more
|
||||
** null-terminated strings. The list is terminated by two nulls in
|
||||
** a row. For example, the following text is key with three strings:
|
||||
** null-terminated elements. The list is terminated by two nulls in
|
||||
** a row. For example, the following text is a key with three elements
|
||||
**
|
||||
** +one\000-two\000+three\000\000
|
||||
** Aone\000Dtwo\000Athree\000\000
|
||||
**
|
||||
** Both arguments will have the same number of strings. This routine
|
||||
** Both arguments will have the same number of elements. This routine
|
||||
** returns negative, zero, or positive if the first argument is less
|
||||
** than, equal to, or greater than the first. (Result is a-b).
|
||||
**
|
||||
** Each string begins with one of the characters "+", "-", "A", "D".
|
||||
** Each element begins with one of the characters "+", "-", "A", "D".
|
||||
** This character determines the sort order and collating sequence:
|
||||
**
|
||||
** + Sort numerically in ascending order
|
||||
@ -715,20 +719,21 @@ int sqliteCompare(const char *atext, const char *btext){
|
||||
**
|
||||
** For the "+" and "-" sorting, pure numeric strings (strings for which the
|
||||
** isNum() function above returns TRUE) always compare less than strings
|
||||
** that are not pure numerics. Within non-numeric strings, substrings
|
||||
** of digits compare in numerical order. Finally, case is used only
|
||||
** to break a tie.
|
||||
** that are not pure numerics. Non-numeric strings compare in memcmp()
|
||||
** order. This is the same sort order as the sqliteCompare() function
|
||||
** above generates.
|
||||
**
|
||||
** Note that the sort order imposed by the rules above is different
|
||||
** The last point is a change from version 2.6.3 to version 2.7.0. In
|
||||
** version 2.6.3 and earlier, substrings of digits compare in numerical
|
||||
** and case was used only to break a tie.
|
||||
**
|
||||
** Elements that begin with 'A' or 'D' compare in memcmp() order regardless
|
||||
** of whether or not they look like a number.
|
||||
**
|
||||
** Note that the sort order imposed by the rules above is the same
|
||||
** from the ordering defined by the "<", "<=", ">", and ">=" operators
|
||||
** of expressions. The operators compare non-numeric strings in
|
||||
** lexigraphical order. This routine does the additional processing
|
||||
** to sort substrings of digits into numerical order and to use case
|
||||
** only as a tie-breaker.
|
||||
**
|
||||
** The special rules above apply only to numeric sorting, when the
|
||||
** prefix is "+" or "-". If the prefix is "A" or "D" then plain old
|
||||
** "strcmp()" is used for the comparison.
|
||||
** of expressions and for indices. This was not the case for version
|
||||
** 2.6.3 and earlier.
|
||||
*/
|
||||
int sqliteSortCompare(const char *a, const char *b){
|
||||
int len;
|
||||
@ -770,13 +775,8 @@ int sqliteSortCompare(const char *a, const char *b){
|
||||
res = +1;
|
||||
break;
|
||||
}else{
|
||||
res = sortStrCmp(&a[1],&b[1],0);
|
||||
if( res==0 ){
|
||||
res = sortStrCmp(&a[1],&b[1],1);
|
||||
}
|
||||
if( res!=0 ){
|
||||
break;
|
||||
}
|
||||
res = strcmp(&a[1],&b[1]);
|
||||
if( res ) break;
|
||||
}
|
||||
}
|
||||
len = strlen(&a[1]) + 2;
|
||||
|
14
src/vdbe.c
14
src/vdbe.c
@ -30,7 +30,7 @@
|
||||
** But other routines are also provided to help in building up
|
||||
** a program instruction by instruction.
|
||||
**
|
||||
** $Id: vdbe.c,v 1.167 2002/07/31 19:50:27 drh Exp $
|
||||
** $Id: vdbe.c,v 1.168 2002/08/13 23:02:57 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include <ctype.h>
|
||||
@ -2308,12 +2308,12 @@ case OP_StrGe: {
|
||||
c = strcmp(zStack[nos], zStack[tos]);
|
||||
}
|
||||
switch( pOp->opcode ){
|
||||
case OP_Eq: c = c==0; break;
|
||||
case OP_Ne: c = c!=0; break;
|
||||
case OP_Lt: c = c<0; break;
|
||||
case OP_Le: c = c<=0; break;
|
||||
case OP_Gt: c = c>0; break;
|
||||
default: c = c>=0; break;
|
||||
case OP_StrEq: c = c==0; break;
|
||||
case OP_StrNe: c = c!=0; break;
|
||||
case OP_StrLt: c = c<0; break;
|
||||
case OP_StrLe: c = c<=0; break;
|
||||
case OP_StrGt: c = c>0; break;
|
||||
default: c = c>=0; break;
|
||||
}
|
||||
POPSTACK;
|
||||
POPSTACK;
|
||||
|
@ -13,7 +13,7 @@
|
||||
** the WHERE clause of SQL statements. Also found here are subroutines
|
||||
** to generate VDBE code to evaluate expressions.
|
||||
**
|
||||
** $Id: where.c,v 1.60 2002/08/13 13:15:51 drh Exp $
|
||||
** $Id: where.c,v 1.61 2002/08/13 23:02:58 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
|
||||
@ -749,6 +749,7 @@ WhereInfo *sqliteWhereBegin(
|
||||
pLevel->iMem = pParse->nMem++;
|
||||
cont = pLevel->cont = sqliteVdbeMakeLabel(v);
|
||||
sqliteVdbeAddOp(v, OP_MakeKey, nColumn, 0);
|
||||
sqliteAddIdxKeyType(v, pIdx);
|
||||
if( nColumn==pIdx->nColumn ){
|
||||
sqliteVdbeAddOp(v, OP_MemStore, pLevel->iMem, 0);
|
||||
testOp = OP_IdxGT;
|
||||
@ -931,6 +932,7 @@ WhereInfo *sqliteWhereBegin(
|
||||
if( testOp!=OP_Noop ){
|
||||
pLevel->iMem = pParse->nMem++;
|
||||
sqliteVdbeAddOp(v, OP_MakeKey, nEqColumn + (score & 1), 0);
|
||||
sqliteAddIdxKeyType(v, pIdx);
|
||||
if( leFlag ){
|
||||
sqliteVdbeAddOp(v, OP_IncrKey, 0, 0);
|
||||
}
|
||||
@ -975,6 +977,7 @@ WhereInfo *sqliteWhereBegin(
|
||||
cont = pLevel->cont = sqliteVdbeMakeLabel(v);
|
||||
if( nEqColumn>0 || (score&2)!=0 ){
|
||||
sqliteVdbeAddOp(v, OP_MakeKey, nEqColumn + ((score&2)!=0), 0);
|
||||
sqliteAddIdxKeyType(v, pIdx);
|
||||
if( !geFlag ){
|
||||
sqliteVdbeAddOp(v, OP_IncrKey, 0, 0);
|
||||
}
|
||||
|
@ -11,7 +11,7 @@
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this file is testing expressions.
|
||||
#
|
||||
# $Id: expr.test,v 1.25 2002/06/29 02:20:09 drh Exp $
|
||||
# $Id: expr.test,v 1.26 2002/08/13 23:02:58 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -189,12 +189,22 @@ test_expr expr-4.1 {t1='abc', t2='Abc'} {t1<t2} 0
|
||||
test_expr expr-4.2 {t1='abc', t2='Abc'} {t1>t2} 1
|
||||
test_expr expr-4.3 {t1='abc', t2='Bbc'} {t1<t2} 0
|
||||
test_expr expr-4.4 {t1='abc', t2='Bbc'} {t1>t2} 1
|
||||
test_expr expr-4.5 {t1='0', t2='0.0'} {t1==t2} 1
|
||||
test_expr expr-4.6 {t1='0.000', t2='0.0'} {t1==t2} 1
|
||||
test_expr expr-4.5 {t1='0', t2='0.0'} {t1==t2} 0
|
||||
test_expr expr-4.6 {t1='0.000', t2='0.0'} {t1==t2} 0
|
||||
test_expr expr-4.7 {t1=' 0.000', t2=' 0.0'} {t1==t2} 0
|
||||
test_expr expr-4.8 {t1='0.0', t2='abc'} {t1<t2} 1
|
||||
test_expr expr-4.9 {t1='0.0', t2='abc'} {t1==t2} 0
|
||||
test_expr expr-4.10 {t1='0.0', t2='abc'} {t1>t2} 0
|
||||
test_expr expr-4.10 {r1='0.0', r2='abc'} {r1>r2} 0
|
||||
test_expr expr-4.11 {r1='abc', r2='Abc'} {r1<r2} 0
|
||||
test_expr expr-4.12 {r1='abc', r2='Abc'} {r1>r2} 1
|
||||
test_expr expr-4.13 {r1='abc', r2='Bbc'} {r1<r2} 0
|
||||
test_expr expr-4.14 {r1='abc', r2='Bbc'} {r1>r2} 1
|
||||
test_expr expr-4.15 {r1='0', r2='0.0'} {r1==r2} 1
|
||||
test_expr expr-4.16 {r1='0.000', r2='0.0'} {r1==r2} 1
|
||||
test_expr expr-4.17 {r1=' 0.000', r2=' 0.0'} {r1==r2} 0
|
||||
test_expr expr-4.18 {r1='0.0', r2='abc'} {r1<r2} 1
|
||||
test_expr expr-4.19 {r1='0.0', r2='abc'} {r1==r2} 0
|
||||
test_expr expr-4.20 {r1='0.0', r2='abc'} {r1>r2} 0
|
||||
|
||||
test_expr expr-5.1 {t1='abc', t2='xyz'} {t1 LIKE t2} 0
|
||||
test_expr expr-5.2 {t1='abc', t2='ABC'} {t1 LIKE t2} 1
|
||||
|
@ -11,7 +11,7 @@
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this file is testing built-in functions.
|
||||
#
|
||||
# $Id: func.test,v 1.14 2002/07/01 00:31:36 drh Exp $
|
||||
# $Id: func.test,v 1.15 2002/08/13 23:02:58 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -107,37 +107,37 @@ do_test func-3.0 {
|
||||
execsql "INSERT INTO tbl1 VALUES('$word')"
|
||||
}
|
||||
execsql {SELECT t1 FROM tbl1 ORDER BY t1}
|
||||
} "characters contains hi\u1234ho UTF-8"
|
||||
} "UTF-8 characters contains hi\u1234ho"
|
||||
do_test func-3.1 {
|
||||
execsql {SELECT length(t1) FROM tbl1 ORDER BY t1}
|
||||
} {10 8 5 5}
|
||||
} {5 10 8 5}
|
||||
do_test func-3.2 {
|
||||
execsql {SELECT substr(t1,1,2) FROM tbl1 ORDER BY t1}
|
||||
} {ch co hi UT}
|
||||
} {UT ch co hi}
|
||||
do_test func-3.3 {
|
||||
execsql {SELECT substr(t1,1,3) FROM tbl1 ORDER BY t1}
|
||||
} "cha con hi\u1234 UTF"
|
||||
} "UTF cha con hi\u1234"
|
||||
do_test func-3.4 {
|
||||
execsql {SELECT substr(t1,2,2) FROM tbl1 ORDER BY t1}
|
||||
} "ha on i\u1234 TF"
|
||||
} "TF ha on i\u1234"
|
||||
do_test func-3.5 {
|
||||
execsql {SELECT substr(t1,2,3) FROM tbl1 ORDER BY t1}
|
||||
} "har ont i\u1234h TF-"
|
||||
} "TF- har ont i\u1234h"
|
||||
do_test func-3.6 {
|
||||
execsql {SELECT substr(t1,3,2) FROM tbl1 ORDER BY t1}
|
||||
} "ar nt \u1234h F-"
|
||||
} "F- ar nt \u1234h"
|
||||
do_test func-3.7 {
|
||||
execsql {SELECT substr(t1,4,2) FROM tbl1 ORDER BY t1}
|
||||
} "ra ta ho -8"
|
||||
} "-8 ra ta ho"
|
||||
do_test func-3.8 {
|
||||
execsql {SELECT substr(t1,-1,1) FROM tbl1 ORDER BY t1}
|
||||
} "s s o 8"
|
||||
} "8 s s o"
|
||||
do_test func-3.9 {
|
||||
execsql {SELECT substr(t1,-3,2) FROM tbl1 ORDER BY t1}
|
||||
} "er in \u1234h F-"
|
||||
} "F- er in \u1234h"
|
||||
do_test func-3.10 {
|
||||
execsql {SELECT substr(t1,-4,3) FROM tbl1 ORDER BY t1}
|
||||
} "ter ain i\u1234h TF-"
|
||||
} "TF- ter ain i\u1234h"
|
||||
do_test func-3.99 {
|
||||
execsql {DELETE FROM tbl1}
|
||||
foreach word {this program is free software} {
|
||||
|
@ -11,7 +11,7 @@
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this file is testing the CREATE INDEX statement.
|
||||
#
|
||||
# $Id: index.test,v 1.19 2002/07/18 00:34:13 drh Exp $
|
||||
# $Id: index.test,v 1.20 2002/08/13 23:02:58 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -74,12 +74,12 @@ do_test index-2.2 {
|
||||
#
|
||||
set r {}
|
||||
for {set i 1} {$i<100} {incr i} {
|
||||
lappend r index$i
|
||||
lappend r [format index%02d $i]
|
||||
}
|
||||
do_test index-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}])"
|
||||
set sql "CREATE INDEX [format index%02d $i] ON test1(f[expr {($i%5)+1}])"
|
||||
execsql $sql
|
||||
}
|
||||
execsql {SELECT name FROM sqlite_master
|
||||
|
@ -12,7 +12,7 @@
|
||||
# focus of this file is testing the LIMIT ... OFFSET ... clause
|
||||
# of SELECT statements.
|
||||
#
|
||||
# $Id: limit.test,v 1.4 2002/06/21 23:01:51 drh Exp $
|
||||
# $Id: limit.test,v 1.5 2002/08/13 23:02:58 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -115,6 +115,6 @@ do_test limit-4.3 {
|
||||
FROM t3 LIMIT 1000;
|
||||
SELECT x FROM t4 ORDER BY y DESC LIMIT 1 OFFSET 999;
|
||||
}
|
||||
} {1}
|
||||
} {1000}
|
||||
|
||||
finish_test
|
||||
|
@ -13,7 +13,7 @@
|
||||
# This file implements tests for miscellanous features that were
|
||||
# left out of other test files.
|
||||
#
|
||||
# $Id: misc1.test,v 1.11 2002/07/30 18:43:42 drh Exp $
|
||||
# $Id: misc1.test,v 1.12 2002/08/13 23:02:58 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -39,7 +39,7 @@ do_test misc1-1.1 {
|
||||
do_test misc1-1.2 {
|
||||
execsql {SELECT x0, x10, x25, x50, x75 FROM manycol}
|
||||
} {0 10 25 50 75}
|
||||
do_test misc1-1.3 {
|
||||
do_test misc1-1.3.1 {
|
||||
for {set j 100} {$j<=1000} {incr j 100} {
|
||||
set cmd "INSERT INTO manycol VALUES($j"
|
||||
for {set i 1} {$i<=99} {incr i} {
|
||||
@ -48,8 +48,11 @@ do_test misc1-1.3 {
|
||||
append cmd ")"
|
||||
execsql $cmd
|
||||
}
|
||||
execsql {SELECT x50 FROM manycol ORDER BY x80}
|
||||
execsql {SELECT x50 FROM manycol ORDER BY x80+0}
|
||||
} {50 150 250 350 450 550 650 750 850 950 1050}
|
||||
do_test misc1-1.3.2 {
|
||||
execsql {SELECT x50 FROM manycol ORDER BY x80}
|
||||
} {1050 150 250 350 450 550 650 750 50 850 950}
|
||||
do_test misc1-1.4 {
|
||||
execsql {SELECT x75 FROM manycol WHERE x50=350}
|
||||
} 375
|
||||
|
@ -11,7 +11,7 @@
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this file is testing the CREATE TABLE statement.
|
||||
#
|
||||
# $Id: sort.test,v 1.4 2002/01/22 14:11:30 drh Exp $
|
||||
# $Id: sort.test,v 1.5 2002/08/13 23:02:58 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -101,25 +101,36 @@ do_test sort-1.11 {
|
||||
# These tests are designed to reach some hard-to-reach places
|
||||
# inside the string comparison routines.
|
||||
#
|
||||
do_test sort-2.1 {
|
||||
# (Later) The sorting behavior changed in 2.7.0. But we will
|
||||
# keep these tests. You can never have too many test cases!
|
||||
#
|
||||
do_test sort-2.1.1 {
|
||||
execsql {
|
||||
UPDATE t1 SET v='x' || -flt;
|
||||
UPDATE t1 SET v='x-2b' where v=='x-0.123';
|
||||
SELECT v FROM t1 ORDER BY v;
|
||||
}
|
||||
} {x-2b x-2.15 x-3.141592653 x-123 x-4221 x0.0013442 x1.6 x11}
|
||||
do_test sort-2.2 {
|
||||
} {x-123 x-2.15 x-2b x-3.141592653 x-4221 x0.0013442 x1.6 x11}
|
||||
do_test sort-2.1.2 {
|
||||
execsql {
|
||||
UPDATE t1 SET v='x-2_' where v=='x0.0013442';
|
||||
SELECT v FROM t1 ORDER BY v;
|
||||
SELECT v FROM t1 ORDER BY substr(v,2,999);
|
||||
}
|
||||
} {x-2_ x-2b x-2.15 x-3.141592653 x-123 x-4221 x1.6 x11}
|
||||
do_test sort-2.3 {
|
||||
} {x-123 x-2.15 x-2b x-3.141592653 x-4221 x0.0013442 x1.6 x11}
|
||||
do_test sort-2.1.3 {
|
||||
execsql {
|
||||
UPDATE t1 SET v='x ' || (-1.3+0.01*n);
|
||||
SELECT v FROM t1 ORDER BY v;
|
||||
SELECT v FROM t1 ORDER BY substr(v,2,999)+0.0;
|
||||
}
|
||||
} {{x -1.29} {x -1.28} {x -1.27} {x -1.26} {x -1.25} {x -1.24} {x -1.23} {x -1.22}}
|
||||
} {x-4221 x-123 x-3.141592653 x-2.15 x-2b x0.0013442 x1.6 x11}
|
||||
do_test sort-2.1.4 {
|
||||
execsql {
|
||||
SELECT v FROM t1 ORDER BY substr(v,2,999) DESC;
|
||||
}
|
||||
} {x11 x1.6 x0.0013442 x-4221 x-3.141592653 x-2b x-2.15 x-123}
|
||||
do_test sort-2.1.5 {
|
||||
execsql {
|
||||
SELECT v FROM t1 ORDER BY substr(v,2,999)+0.0 DESC;
|
||||
}
|
||||
} {x11 x1.6 x0.0013442 x-2b x-2.15 x-3.141592653 x-123 x-4221}
|
||||
|
||||
# This is a bug fix for 2.2.4.
|
||||
# Strings are normally mapped to upper-case for a caseless comparison.
|
||||
@ -154,5 +165,58 @@ do_test sort-3.4 {
|
||||
}
|
||||
} {agna 3 aglientu 1 aglie` 2}
|
||||
|
||||
# Version 2.7.0 testing.
|
||||
#
|
||||
do_test sort-4.1 {
|
||||
execsql {
|
||||
INSERT INTO t1 VALUES(9,'x2.7',3,'IX',4.0e5);
|
||||
INSERT INTO t1 VALUES(10,'x5.0e10',3,'X',-4.0e5);
|
||||
INSERT INTO t1 VALUES(11,'x-4.0e9',3,'XI',4.1e4);
|
||||
INSERT INTO t1 VALUES(12,'x01234567890123456789',3,'XII',-4.2e3);
|
||||
SELECT n FROM t1 ORDER BY n;
|
||||
}
|
||||
} {1 2 3 4 5 6 7 8 9 10 11 12}
|
||||
do_test sort-4.2 {
|
||||
execsql {
|
||||
SELECT n||'' FROM t1 ORDER BY 1;
|
||||
}
|
||||
} {1 10 11 12 2 3 4 5 6 7 8 9}
|
||||
do_test sort-4.3 {
|
||||
execsql {
|
||||
SELECT n+0 FROM t1 ORDER BY 1;
|
||||
}
|
||||
} {1 2 3 4 5 6 7 8 9 10 11 12}
|
||||
do_test sort-4.4 {
|
||||
execsql {
|
||||
SELECT n||'' FROM t1 ORDER BY 1 DESC;
|
||||
}
|
||||
} {9 8 7 6 5 4 3 2 12 11 10 1}
|
||||
do_test sort-4.5 {
|
||||
execsql {
|
||||
SELECT n+0 FROM t1 ORDER BY 1 DESC;
|
||||
}
|
||||
} {12 11 10 9 8 7 6 5 4 3 2 1}
|
||||
do_test sort-4.6 {
|
||||
execsql {
|
||||
SELECT v FROM t1 ORDER BY 1;
|
||||
}
|
||||
} {x-123 x-2.15 x-2b x-3.141592653 x-4.0e9 x-4221 x0.0013442 x01234567890123456789 x1.6 x11 x2.7 x5.0e10}
|
||||
do_test sort-4.7 {
|
||||
execsql {
|
||||
SELECT v FROM t1 ORDER BY 1 DESC;
|
||||
}
|
||||
} {x5.0e10 x2.7 x11 x1.6 x01234567890123456789 x0.0013442 x-4221 x-4.0e9 x-3.141592653 x-2b x-2.15 x-123}
|
||||
do_test sort-4.8 {
|
||||
execsql {
|
||||
SELECT substr(v,2,99) FROM t1 ORDER BY 1;
|
||||
}
|
||||
} {-123 -2.15 -2b -3.141592653 -4.0e9 -4221 0.0013442 01234567890123456789 1.6 11 2.7 5.0e10}
|
||||
do_test sort-4.9 {
|
||||
execsql {
|
||||
SELECT substr(v,2,99)+0.0 FROM t1 ORDER BY 1;
|
||||
}
|
||||
} {-4000000000 -4221 -123 -3.141592653 -2.15 -2 0.0013442 1.6 2.7 11 50000000000 1.23456789012346e+18}
|
||||
|
||||
|
||||
|
||||
finish_test
|
||||
|
@ -11,7 +11,7 @@
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this file is testing the CREATE TABLE statement.
|
||||
#
|
||||
# $Id: table.test,v 1.18 2002/07/05 21:42:38 drh Exp $
|
||||
# $Id: table.test,v 1.19 2002/08/13 23:02:58 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -192,11 +192,11 @@ do_test table-3.6 {
|
||||
#
|
||||
set r {}
|
||||
for {set i 1} {$i<=100} {incr i} {
|
||||
lappend r test$i
|
||||
lappend r [format test%03d $i]
|
||||
}
|
||||
do_test table-4.1 {
|
||||
for {set i 1} {$i<=100} {incr i} {
|
||||
set sql "CREATE TABLE test$i ("
|
||||
set sql "CREATE TABLE [format test%03d $i] ("
|
||||
for {set k 1} {$k<$i} {incr k} {
|
||||
append sql "field$k text,"
|
||||
}
|
||||
@ -215,12 +215,12 @@ do_test table-4.1b {
|
||||
#
|
||||
set r {}
|
||||
for {set i 1} {$i<=100} {incr i 2} {
|
||||
lappend r test$i
|
||||
lappend r [format test%03d $i]
|
||||
}
|
||||
#execsql {--vdbe-trace-on--}
|
||||
do_test table-4.2 {
|
||||
for {set i 2} {$i<=100} {incr i 2} {
|
||||
set sql "DROP TABLE TEST$i"
|
||||
set sql "DROP TABLE [format TEST%03d $i]"
|
||||
execsql $sql
|
||||
}
|
||||
execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
|
||||
@ -231,7 +231,7 @@ do_test table-4.2 {
|
||||
#
|
||||
do_test table-4.3 {
|
||||
for {set i 1} {$i<=100} {incr i 2} {
|
||||
set sql "DROP TABLE test$i"
|
||||
set sql "DROP TABLE [format test%03d $i]"
|
||||
execsql $sql
|
||||
}
|
||||
execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
|
||||
@ -240,9 +240,9 @@ do_test table-4.3 {
|
||||
# Try to drop a table that does not exist
|
||||
#
|
||||
do_test table-5.1 {
|
||||
set v [catch {execsql {DROP TABLE test9}} msg]
|
||||
set v [catch {execsql {DROP TABLE test009}} msg]
|
||||
lappend v $msg
|
||||
} {1 {no such table: test9}}
|
||||
} {1 {no such table: test009}}
|
||||
|
||||
# Try to drop sqlite_master
|
||||
#
|
||||
|
@ -12,13 +12,13 @@
|
||||
# focus of this file is testing the ability of the library to detect
|
||||
# past or future file format version numbers and respond appropriately.
|
||||
#
|
||||
# $Id: version.test,v 1.5 2002/08/11 20:10:49 drh Exp $
|
||||
# $Id: version.test,v 1.6 2002/08/13 23:02:59 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
# Current file format version
|
||||
set VX 3
|
||||
set VX 4
|
||||
|
||||
# Create a new database
|
||||
#
|
||||
|
@ -25,6 +25,12 @@ proc chng {date desc} {
|
||||
puts "<DD><P><UL>$desc</UL></P></DD>"
|
||||
}
|
||||
|
||||
chng {2002 Aug ?? (2.7.0)} {
|
||||
<li>Make a distinction between numeric and text values when sorting.
|
||||
Text values sort according to memcmp(). Numeric values sort in
|
||||
numeric order.</li>
|
||||
}
|
||||
|
||||
chng {2002 Aug 12 (2.6.3)} {
|
||||
<li>Add the ability to read both little-endian and big-endian databases.
|
||||
So database created under SunOS or MacOSX can be read and written
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Run this Tcl script to generate the formatchng.html file.
|
||||
#
|
||||
set rcsid {$Id: formatchng.tcl,v 1.6 2002/07/18 02:07:08 drh Exp $ }
|
||||
set rcsid {$Id: formatchng.tcl,v 1.7 2002/08/13 23:02:59 drh Exp $ }
|
||||
|
||||
puts {<html>
|
||||
<head>
|
||||
@ -136,6 +136,27 @@ occurred since version 1.0.0:
|
||||
upgraded to the new format.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">2.6.3 to 2.7.0</td>
|
||||
<td valign="top">2002-Aug-13</td>
|
||||
<td><p>Beginning with version 2.7.0, SQLite understands two different
|
||||
datatypes: text and numeric. Text data sorts in memcmp() order.
|
||||
Numeric data sorts in numerical order if it looks like a number,
|
||||
or in memcmp() order if it does not.</p>
|
||||
|
||||
<p>When SQLite version 2.7.0 or later opens a 2.6.3 or earlier database,
|
||||
it assumes all columns of all tables have type "numeric". For 2.7.0
|
||||
and later databases, columns have type "text" if their datatype
|
||||
string contains the substrings "char" or "clob" or "blob" or "text".
|
||||
Otherwise they are of type "numeric".</p>
|
||||
|
||||
<p>Because "text" columns have a different sort order from numeric,
|
||||
indices on "text" columns occur in a different order for version
|
||||
2.7.0 and later database. Hence version 2.6.3 and earlier of SQLite
|
||||
will be unable to read a 2.7.0 or later database. But version 2.7.0
|
||||
and later of SQLite will read earlier database version.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</blockquote>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user