From a9e99aee95e79149dfbb19af75a967c22225f202 Mon Sep 17 00:00:00 2001
From: drh
Date: Tue, 13 Aug 2002 23:02:57 +0000
Subject: [PATCH] Make the distinction between text and numeric data. (CVS 710)
FossilOrigin-Name: 310ac4fbaf0ed63f98bfacb55259960be03b0c8b
---
VERSION | 2 +-
manifest | 40 ++++++++++-----------
manifest.uuid | 2 +-
src/main.c | 8 ++---
src/util.c | 66 +++++++++++++++++------------------
src/vdbe.c | 14 ++++----
src/where.c | 5 ++-
test/expr.test | 18 +++++++---
test/func.test | 24 ++++++-------
test/index.test | 6 ++--
test/limit.test | 4 +--
test/misc1.test | 9 +++--
test/sort.test | 86 ++++++++++++++++++++++++++++++++++++++++------
test/table.test | 16 ++++-----
test/version.test | 4 +--
www/changes.tcl | 6 ++++
www/formatchng.tcl | 23 ++++++++++++-
17 files changed, 220 insertions(+), 113 deletions(-)
diff --git a/VERSION b/VERSION
index ec1cf33c3f..24ba9a38de 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.6.3
+2.7.0
diff --git a/manifest b/manifest
index 9f6c6603c2..e7b4faaea7 100644
--- a/manifest
+++ b/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
diff --git a/manifest.uuid b/manifest.uuid
index 9942708138..fded00607f 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-92c403f485390bbd83a5be472e61c974f76d46b1
\ No newline at end of file
+310ac4fbaf0ed63f98bfacb55259960be03b0c8b
\ No newline at end of file
diff --git a/src/main.c b/src/main.c
index 1bb740ffd8..1924c8e16a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);
}
diff --git a/src/util.c b/src/util.c
index 21736e9ea3..11f9f752e9 100644
--- a/src/util.c
+++ b/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
@@ -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;
diff --git a/src/vdbe.c b/src/vdbe.c
index 9697e4d24d..637905c425 100644
--- a/src/vdbe.c
+++ b/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
@@ -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;
diff --git a/src/where.c b/src/where.c
index dfbbbafcb7..8211d42392 100644
--- a/src/where.c
+++ b/src/where.c
@@ -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);
}
diff --git a/test/expr.test b/test/expr.test
index c672988cb7..8ec0c83d14 100644
--- a/test/expr.test
+++ b/test/expr.test
@@ -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'} {t1t2} 1
test_expr expr-4.3 {t1='abc', t2='Bbc'} {t1t2} 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'} {t1t2} 0
+test_expr expr-4.10 {r1='0.0', r2='abc'} {r1>r2} 0
+test_expr expr-4.11 {r1='abc', r2='Abc'} {r1r2} 1
+test_expr expr-4.13 {r1='abc', r2='Bbc'} {r1r2} 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'} {r1r2} 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
diff --git a/test/func.test b/test/func.test
index 32cfb395b5..5f37fe66ae 100644
--- a/test/func.test
+++ b/test/func.test
@@ -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} {
diff --git a/test/index.test b/test/index.test
index 10e65618e2..dc20dbd750 100644
--- a/test/index.test
+++ b/test/index.test
@@ -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
diff --git a/test/limit.test b/test/limit.test
index bc157fdf66..2d655e80e9 100644
--- a/test/limit.test
+++ b/test/limit.test
@@ -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
diff --git a/test/misc1.test b/test/misc1.test
index 41693c7965..d779605787 100644
--- a/test/misc1.test
+++ b/test/misc1.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
diff --git a/test/sort.test b/test/sort.test
index 5d37881f8e..049797b134 100644
--- a/test/sort.test
+++ b/test/sort.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: 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
diff --git a/test/table.test b/test/table.test
index c4b432070f..7b1d9ae296 100644
--- a/test/table.test
+++ b/test/table.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
#
diff --git a/test/version.test b/test/version.test
index 30a39cc138..e131cf44cb 100644
--- a/test/version.test
+++ b/test/version.test
@@ -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
#
diff --git a/www/changes.tcl b/www/changes.tcl
index 584c0ade6a..0653ccb6b3 100644
--- a/www/changes.tcl
+++ b/www/changes.tcl
@@ -25,6 +25,12 @@ proc chng {date desc} {
puts "
"
}
+chng {2002 Aug ?? (2.7.0)} {
+Make a distinction between numeric and text values when sorting.
+ Text values sort according to memcmp(). Numeric values sort in
+ numeric order.
+}
+
chng {2002 Aug 12 (2.6.3)} {
Add the ability to read both little-endian and big-endian databases.
So database created under SunOS or MacOSX can be read and written
diff --git a/www/formatchng.tcl b/www/formatchng.tcl
index 41288d4529..9456c1b981 100644
--- a/www/formatchng.tcl
+++ b/www/formatchng.tcl
@@ -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 {
@@ -136,6 +136,27 @@ occurred since version 1.0.0:
upgraded to the new format.
+
+ 2.6.3 to 2.7.0 |
+ 2002-Aug-13 |
+ 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.
+
+ 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".
+
+ 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.
+ |
+