aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordanielk1977 <danielk1977@noemail.net>2004-05-27 10:30:52 +0000
committerdanielk1977 <danielk1977@noemail.net>2004-05-27 10:30:52 +0000
commitf93bbbea471def025db1036630b735bd3b2d4177 (patch)
treeb5ae21ea013553b4e1d5dd7c6b29a49d6447038a /src
parentc572ef7fcd5a400d78317cd8a77ee684b0136c0b (diff)
downloadsqlite-f93bbbea471def025db1036630b735bd3b2d4177.tar.gz
sqlite-f93bbbea471def025db1036630b735bd3b2d4177.zip
A few more bugfixes. Test cases pass now. (CVS 1472)
FossilOrigin-Name: c9e3015faffb650d8dbf1f7f95a7057a36361bac
Diffstat (limited to 'src')
-rw-r--r--src/func.c12
-rw-r--r--src/select.c3
-rw-r--r--src/test1.c14
-rw-r--r--src/vdbemem.c19
4 files changed, 28 insertions, 20 deletions
diff --git a/src/func.c b/src/func.c
index 31dd1f2fe..c1b986382 100644
--- a/src/func.c
+++ b/src/func.c
@@ -16,7 +16,7 @@
** sqliteRegisterBuildinFunctions() found at the bottom of the file.
** All other code has file scope.
**
-** $Id: func.c,v 1.60 2004/05/27 09:28:42 danielk1977 Exp $
+** $Id: func.c,v 1.61 2004/05/27 10:30:53 danielk1977 Exp $
*/
#include <ctype.h>
#include <math.h>
@@ -42,7 +42,9 @@ static void minmaxFunc(
mask = (int)sqlite3_user_data(context);
assert( mask==-1 || mask==0 );
iBest = 0;
+ if( sqlite3_value_type(argv[0])==SQLITE3_NULL ) return;
for(i=1; i<argc; i++){
+ if( sqlite3_value_type(argv[i])==SQLITE3_NULL ) return;
if( (sqlite3MemCompare(argv[iBest], argv[i], 0)^mask)>=0 ){
iBest = i;
}
@@ -107,7 +109,9 @@ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
assert( argc==1 );
switch( sqlite3_value_type(argv[0]) ){
case SQLITE3_INTEGER: {
- sqlite3_result_int64(context, -sqlite3_value_int64(argv[0]));
+ i64 iVal = sqlite3_value_int64(argv[0]);
+ if( iVal<0 ) iVal = iVal * -1;
+ sqlite3_result_int64(context, iVal);
break;
}
case SQLITE3_NULL: {
@@ -115,7 +119,9 @@ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
break;
}
default: {
- sqlite3_result_double(context, -sqlite3_value_double(argv[0]));
+ double rVal = sqlite3_value_double(argv[0]);
+ if( rVal<0 ) rVal = rVal * -1.0;
+ sqlite3_result_double(context, rVal);
break;
}
}
diff --git a/src/select.c b/src/select.c
index 36431d91e..1a8d46176 100644
--- a/src/select.c
+++ b/src/select.c
@@ -12,7 +12,7 @@
** This file contains C code routines that are called by the parser
** to handle SELECT statements in SQLite.
**
-** $Id: select.c,v 1.178 2004/05/26 16:54:44 drh Exp $
+** $Id: select.c,v 1.179 2004/05/27 10:30:53 danielk1977 Exp $
*/
#include "sqliteInt.h"
@@ -2119,6 +2119,7 @@ int sqlite3Select(
case SRT_Union:
case SRT_Except:
case SRT_Discard:
+ case SRT_Set:
pOrderBy = 0;
break;
default:
diff --git a/src/test1.c b/src/test1.c
index 095e5b276..c3ec5ded1 100644
--- a/src/test1.c
+++ b/src/test1.c
@@ -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.62 2004/05/27 09:28:43 danielk1977 Exp $
+** $Id: test1.c,v 1.63 2004/05/27 10:31:10 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "tcl.h"
@@ -1585,6 +1585,7 @@ static int test_stmt_utf8(
sqlite3_stmt *pStmt;
int col;
const char *(*xFunc)(sqlite3_stmt*, int) = clientData;
+ const char *zRet;
if( objc!=3 ){
Tcl_AppendResult(interp, "wrong # args: should be \"",
@@ -1594,7 +1595,10 @@ static int test_stmt_utf8(
if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR;
if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR;
- Tcl_SetResult(interp, (char *)xFunc(pStmt, col), 0);
+ zRet = xFunc(pStmt, col);
+ if( zRet ){
+ Tcl_SetResult(interp, (char *)zRet, 0);
+ }
return TCL_OK;
}
@@ -1627,8 +1631,10 @@ static int test_stmt_utf16(
if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR;
zName16 = xFunc(pStmt, col);
- pRet = Tcl_NewByteArrayObj(zName16, sqlite3utf16ByteLen(zName16, -1)+2);
- Tcl_SetObjResult(interp, pRet);
+ if( zName16 ){
+ pRet = Tcl_NewByteArrayObj(zName16, sqlite3utf16ByteLen(zName16, -1)+2);
+ Tcl_SetObjResult(interp, pRet);
+ }
return TCL_OK;
}
diff --git a/src/vdbemem.c b/src/vdbemem.c
index 05e304d1e..3cf07d58b 100644
--- a/src/vdbemem.c
+++ b/src/vdbemem.c
@@ -66,7 +66,7 @@ int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
int i;
u8 *pFrom, *pTo;
sqlite3VdbeMemMakeWriteable(pMem);
- for(i=0, pFrom=pMem->z, pTo=&pMem->z[1]; i<pMem->n; i+=2, pFrom++, pTo++){
+ for(i=0, pFrom=pMem->z, pTo=&pMem->z[1]; i<pMem->n; i+=2, pFrom+=2,pTo+=2){
u8 temp = *pFrom;
*pFrom = *pTo;
*pTo = temp;
@@ -179,7 +179,7 @@ int sqlite3VdbeMemStringify(Mem *pMem, int enc){
** FIX ME: It would be better if sqlite3_snprintf() could do UTF-16.
*/
u8 *z = pMem->zShort;
- if( fg & MEM_Real ){
+ if( fg & MEM_Real || (pMem->type==SQLITE3_FLOAT) ){
sqlite3_snprintf(NBFS, z, "%.15g", pMem->r);
}else{
assert( fg & MEM_Int );
@@ -223,9 +223,7 @@ int sqlite3VdbeMemIntegerify(Mem *pMem){
}else{
pMem->i = 0;
}
- releaseMem(pMem);
- pMem->flags = MEM_Int;
- pMem->type = SQLITE3_INTEGER;
+ pMem->flags |= MEM_Int;
return SQLITE_OK;
}
@@ -235,9 +233,10 @@ int sqlite3VdbeMemIntegerify(Mem *pMem){
** converted into 0.0.
*/
int sqlite3VdbeMemRealify(Mem *pMem){
- if( pMem->flags & MEM_Int ){
+ if( pMem->flags & MEM_Real ){
+ /* Do nothing */
+ }else if( (pMem->flags & MEM_Int) && pMem->type!=SQLITE3_TEXT ){
pMem->r = pMem->i;
- pMem->flags |= MEM_Real;
}else if( pMem->flags & (MEM_Str|MEM_Blob) ){
if( sqlite3VdbeChangeEncoding(pMem, TEXT_Utf8)
|| sqlite3VdbeMemNulTerminate(pMem) ){
@@ -245,14 +244,10 @@ int sqlite3VdbeMemRealify(Mem *pMem){
}
assert( pMem->z );
pMem->r = sqlite3AtoF(pMem->z, 0);
- releaseMem(pMem);
- pMem->flags = MEM_Real;
- pMem->type = SQLITE3_FLOAT;
}else{
pMem->r = 0.0;
- pMem->flags = MEM_Real;
- pMem->type = SQLITE3_FLOAT;
}
+ pMem->flags |= MEM_Real;
return SQLITE_OK;
}