]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
A different way to clear the subtype on VDBE registers when the value of the register... clear-subtype-flag
authordan <dan@noemail.net>
Sat, 30 Jan 2016 15:46:03 +0000 (15:46 +0000)
committerdan <dan@noemail.net>
Sat, 30 Jan 2016 15:46:03 +0000 (15:46 +0000)
FossilOrigin-Name: 2e9fb1295cd31fc29c97444c3dec82fef68e939f

manifest
manifest.uuid
src/utf.c
src/vdbe.c
src/vdbeInt.h
src/vdbeapi.c
test/json103.test

index c42504832ee730c6423e45af5e576848ad5a8433..16ab0b16b95529d56d53eee49da21d6059c164b7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Output\ssubtype\sinformation\son\sregister\straces\sfor\sPRAGMA\svdbe_trace.
-D 2016-01-30T14:17:10.486
+C A\sdifferent\sway\sto\sclear\sthe\ssubtype\son\sVDBE\sregisters\swhen\sthe\svalue\sof\sthe\sregister\sis\soverwritten\swith\snew\scontent.\sTo\sfix\s[[f45ac567eaa9f93].
+D 2016-01-30T15:46:03.527
 F Makefile.in 027c1603f255390c43a426671055a31c0a65fdb4
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 72b7858f02017611c3ac1ddc965251017fed0845
@@ -409,13 +409,13 @@ F src/tokenize.c 5606871a377f390af7040ec3c12e0d183512d785
 F src/treeview.c dc39ccf04e9331237388b9cb73289c9d87ea050b
 F src/trigger.c 72d876b2d0c66604a112362bdae07dae9b104816
 F src/update.c 17332f9fe818cbc0444c36a811800af8498af4c3
-F src/utf.c 32d7f82aa921322f3e1c956f4b58f019ebd2c6b3
+F src/utf.c 10cc2519e82e3369344d0969ad4b1a333dc86d18
 F src/util.c 72d40df0a52d3f30b462a15f0e094fcbade6dc82
 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
-F src/vdbe.c bd4d2cabbafe49bd8e04d7bf57d8e480393268d9
+F src/vdbe.c 49e0a224526f4307ab80e9d3a63697b28cf0cb21
 F src/vdbe.h 7a733ea8aac1b77305a67698e784fa3484ee3337
-F src/vdbeInt.h 716df83ac45b70ff000b515040ea606d0cb5d0f3
-F src/vdbeapi.c ffae8f5af4570fbd548504e815e9fb7227f0822e
+F src/vdbeInt.h 4b69d5451bcadd473e745af53ef1e8abfdce0a79
+F src/vdbeapi.c 9d640d5efd9a140a6bda8da53b220aa258167993
 F src/vdbeaux.c 221631e40111b5efa96ea557c6e2e7f62fd32b2a
 F src/vdbeblob.c 37c3d11a753e403698c69e17383d282e1ae73e75
 F src/vdbemem.c b9181e77eca2a095929d46250daf85c8d2621fc0
@@ -834,7 +834,7 @@ F test/jrnlmode2.test 81610545a4e6ed239ea8fa661891893385e23a1d
 F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa
 F test/json101.test f0178422b3a2418f423fd0d3caf3571c8d1b9863
 F test/json102.test bf3fe7a706d30936a76a0f7a0375e1e8e73aff5a
-F test/json103.test 923b288a0610ec86c0951778f7db19cbcca36ad1
+F test/json103.test c5f6b85e69de05f6b3195f9f9d5ce9cd179099a0
 F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff
 F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63
 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200
@@ -1422,7 +1422,10 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 85c467041c9378cae3038756da815e9117ee8c7d
-R 694b551c33162b646e920ddc57abdc60
-U drh
-Z fd54d0de297ea145965f78cad2cde9ad
+P 96b780209cc95c3f3769bb880591380d94bfe38d
+R bd3d63263e82ae4209cc8f920c59f1ec
+T *branch * clear-subtype-flag
+T *sym-clear-subtype-flag *
+T -sym-trunk *
+U dan
+Z b20671d59699e15a0872203a064b7cf5
index 6041e7c2466d876a0e2114b85a4c12e7ac3726e4..5e497038132aabe19565e41ae6b4770e8fa11079 100644 (file)
@@ -1 +1 @@
-96b780209cc95c3f3769bb880591380d94bfe38d
\ No newline at end of file
+2e9fb1295cd31fc29c97444c3dec82fef68e939f
\ No newline at end of file
index ee367c139977f74125ecdf9c19b19813ac4ff61a..e42ab418ad303310b9fa460ed28cd1f4cf4dfcf7 100644 (file)
--- a/src/utf.c
+++ b/src/utf.c
@@ -316,7 +316,7 @@ SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
 
   c = pMem->flags;
   sqlite3VdbeMemRelease(pMem);
-  pMem->flags = MEM_Str|MEM_Term|(c&MEM_AffMask);
+  pMem->flags = MEM_Str|MEM_Term|(c&(MEM_AffMask|MEM_Subtype));
   pMem->enc = desiredEnc;
   pMem->z = (char*)zOut;
   pMem->zMalloc = pMem->z;
index ebb7e046fe6c87f27434d67c9182a826a46626a0..c6ae836a2855f62127aae0b911e864e85e804d3c 100644 (file)
@@ -471,7 +471,7 @@ static void memTracePrint(Mem *p){
     sqlite3VdbeMemPrettyPrint(p, zBuf);
     printf(" %s", zBuf);
   }
-  if( p->eSubtype ) printf(" subtype=0x%02x", p->eSubtype);
+  if( p->flags & MEM_Subtype ) printf(" subtype=0x%02x", p->eSubtype);
 }
 static void registerTrace(int iReg, Mem *p){
   printf("REG[%d] = ", iReg);
index 497beb87d5ac4dc1131f7e917f49ccb850c29cf6..839c2039be7bb5c3f1549f3d24277571657c5b25 100644 (file)
@@ -238,7 +238,7 @@ struct Mem {
 #define MEM_Frame     0x0040   /* Value is a VdbeFrame object */
 #define MEM_Undefined 0x0080   /* Value is undefined */
 #define MEM_Cleared   0x0100   /* NULL set by OP_Null, not from data */
-#define MEM_TypeMask  0x01ff   /* Mask of type bits */
+#define MEM_TypeMask  0x81ff   /* Mask of type bits */
 
 
 /* Whenever Mem contains a valid string or blob representation, one of
@@ -252,11 +252,18 @@ struct Mem {
 #define MEM_Ephem     0x1000   /* Mem.z points to an ephemeral string */
 #define MEM_Agg       0x2000   /* Mem.z points to an agg function context */
 #define MEM_Zero      0x4000   /* Mem.i contains count of 0s appended to blob */
+#define MEM_Subtype   0x8000   /* Mem.eSubtype is valid */
 #ifdef SQLITE_OMIT_INCRBLOB
   #undef MEM_Zero
   #define MEM_Zero 0x0000
 #endif
 
+/* Return TRUE if Mem X contains dynamically allocated content - anything
+** that needs to be deallocated to avoid a leak.
+*/
+#define VdbeMemDynamic(X)  \
+  (((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))!=0)
+
 /*
 ** Clear any existing type flags from a Mem and replace them with f
 */
@@ -472,8 +479,6 @@ int sqlite3VdbeMemNumerify(Mem*);
 void sqlite3VdbeMemCast(Mem*,u8,u8);
 int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,int,Mem*);
 void sqlite3VdbeMemRelease(Mem *p);
-#define VdbeMemDynamic(X)  \
-  (((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))!=0)
 int sqlite3VdbeMemFinalize(Mem*, FuncDef*);
 const char *sqlite3OpcodeName(int);
 int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve);
index 4bc912b9405f36f6fa9c61d25880d64765565fe0..0a15633ddff14122a97c4004ef6d18bfd5448b0a 100644 (file)
@@ -188,7 +188,8 @@ sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){
   return sqlite3VdbeIntValue((Mem*)pVal);
 }
 unsigned int sqlite3_value_subtype(sqlite3_value *pVal){
-  return ((Mem*)pVal)->eSubtype;
+  Mem *pMem = (Mem*)pVal;
+  return ((pMem->flags & MEM_Subtype) ? pMem->eSubtype : 0);
 }
 const unsigned char *sqlite3_value_text(sqlite3_value *pVal){
   return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8);
@@ -369,8 +370,10 @@ void sqlite3_result_null(sqlite3_context *pCtx){
   sqlite3VdbeMemSetNull(pCtx->pOut);
 }
 void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubtype){
-  assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
-  pCtx->pOut->eSubtype = eSubtype & 0xff;
+  Mem *pOut = pCtx->pOut;
+  assert( sqlite3_mutex_held(pOut->db->mutex) );
+  pOut->eSubtype = eSubtype & 0xff;
+  pOut->flags |= MEM_Subtype;
 }
 void sqlite3_result_text(
   sqlite3_context *pCtx, 
index 0f0241e6fcac4eaf85045aa93e3c346beadc7cfd..d7d12e3378259c7b92bfc0a89504d97fd9b04e7a 100644 (file)
@@ -60,6 +60,19 @@ do_execsql_test json103-220 {
    WHERE rowid<7 GROUP BY b ORDER BY b;
 } {0 {{"n3":3,"n6":6}} 1 {{"n1":1,"n4":4}} 2 {{"n2":2,"n5":5}}}
 
-
+# ticket https://www.sqlite.org/src/info/f45ac567eaa9f93c 2016-01-30
+# Invalid JSON generated by json_group_array() 
+#
+# The underlying problem is a failure to reset Mem.eSubtype
+#
+do_execsql_test json103-300 {
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t1(x);
+  INSERT INTO t1 VALUES(1),('abc');
+  SELECT
+     json_group_array(x),
+     json_group_array(json_object('x',x))
+    FROM t1;
+} {{[1,"abc"]} {[{"x":1},{"x":"abc"}]}}
 
 finish_test