]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Avoid unnecessary affinity transformations when building indices using
authordrh <drh@noemail.net>
Thu, 2 Jan 2014 19:35:30 +0000 (19:35 +0000)
committerdrh <drh@noemail.net>
Thu, 2 Jan 2014 19:35:30 +0000 (19:35 +0000)
data from a table.

FossilOrigin-Name: 10d851353c2abeadbd2852c210a7ff9f7f513e5d

manifest
manifest.uuid
src/delete.c
src/sqliteInt.h
src/test1.c
src/vdbe.h
src/vdbeaux.c

index 142a875f5d3d2a40775f35790670effb3d6807f6..b647b373c84c6f52f9518a231a307f0d4ab84430 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Be\smore\saggressive\sin\soptimizing\sconstant\sconditional\sexpressions.
-D 2014-01-02T17:57:16.874
+C Avoid\sunnecessary\saffinity\stransformations\swhen\sbuilding\sindices\susing\ndata\sfrom\sa\stable.
+D 2014-01-02T19:35:30.181
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -174,7 +174,7 @@ F src/callback.c 174e3c8656bc29f91d710ab61550d16eea34be98
 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
 F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd
 F src/date.c 593c744b2623971e45affd0bde347631bdfa4625
-F src/delete.c 821da82527c24496bef0677ed4f61a53b44c27ee
+F src/delete.c 22f3dc3fd6b82ebce3dabf951a4b157026943ac1
 F src/expr.c ca0959386f01d6e5d4dc67b362a4e4c912ebd054
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c 2ab0f5384b70594468ef3ac5c7ed8ca24bfd17d5
@@ -224,12 +224,12 @@ F src/shell.c a3541193d5fce37e91dad8ef46a9505aa7c9b344
 F src/sqlite.h.in d94a8b89522f526ba711182ee161e06f8669bcc9
 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
 F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
-F src/sqliteInt.h 62664868458b53a815380733f059ff9d92cb08be
+F src/sqliteInt.h a77cb6c7404d1a20e536211be4a2e4be01cde213
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
 F src/tclsqlite.c c43379f77f90399802b0e215faa71c0adc3a4d2e
-F src/test1.c 633e5e6a116acf4473b9289240bcceb5320a9d93
+F src/test1.c db16ba651453b15001c7f2838c446284dde4ecaf
 F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35
 F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c
 F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df
@@ -281,10 +281,10 @@ F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
 F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c
 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
 F src/vdbe.c b110887e415b5d2af58c2374c4dfdcf774c5d46c
-F src/vdbe.h c3278ab2b410f17acf61faf91be7bce3fd466e8b
+F src/vdbe.h 298e0492827ef9db626934d060df62ed27ba56bc
 F src/vdbeInt.h 42db251e9f863401ff847b90d5fe1614c89a6a56
 F src/vdbeapi.c ce4e68ea4842cc6081046f533d088dcf01d247ad
-F src/vdbeaux.c bc6799db8795cd1480f2cab6cb22acf47e3e640f
+F src/vdbeaux.c 915fda7ca876aa2df2a13b0621ad0326342c0638
 F src/vdbeblob.c bc40f98f256f0b34116d6a44b114da4a81a15d33
 F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2
 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147
@@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P e1eba1fb09d7db49d77928bd115b27b8002ae640
-R 8c33ee4ecd82143d9dd9bc5270372c1d
+P b7e39851a75b87ebca747b26a39989560fd6362b
+R 8c4d4f58f19d587102e868c570c261da
 U drh
-Z 948115126ed1b38f36b2ba1121c24109
+Z 387b8179fd8db58dae028273b1bc8ad7
index 38faece72d7ae338ca844780d8d122d10676251e..b39edb4e717ed98b40121125415e408e889bead3 100644 (file)
@@ -1 +1 @@
-b7e39851a75b87ebca747b26a39989560fd6362b
\ No newline at end of file
+10d851353c2abeadbd2852c210a7ff9f7f513e5d
\ No newline at end of file
index 8746cd324a581cbbd90f65dc36f72672986961a6..0180ec48c8cbc5098347003b58540711811d7e9a 100644 (file)
@@ -784,18 +784,18 @@ int sqlite3GenerateIndexKey(
   for(j=0; j<nCol; j++){
     sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pIdx->aiColumn[j],
                                     regBase+j);
+    /* If the column affinity is REAL but the number is an integer, then it
+    ** might be stored in the table as an integer (using a compact
+    ** representation) then converted to REAL by an OP_RealAffinity opcode.
+    ** But we are getting ready to store this value back into an index, where
+    ** it should be converted by to INTEGER again.  So omit the OP_RealAffinity
+    ** opcode if it is present */
+    if( sqlite3VdbeGetOp(v, -1)->opcode==OP_RealAffinity ){
+      sqlite3VdbeDeleteLastOpcode(v);
+    }
   }
   if( regOut ){
-    const char *zAff;
-    if( pTab->pSelect
-     || OptimizationDisabled(pParse->db, SQLITE_IdxRealAsInt)
-    ){
-      zAff = 0;
-    }else{
-      zAff = sqlite3IndexAffinityStr(v, pIdx);
-    }
     sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut);
-    sqlite3VdbeChangeP4(v, -1, zAff, P4_TRANSIENT);
   }
   sqlite3ReleaseTempRange(pParse, regBase, nCol);
   return regBase;
index 77ed38374f434524fc97bddb89297f385343b03d..5943ced2a0f55a63202a4ab06ec02558ec6f861a 100644 (file)
@@ -1056,7 +1056,7 @@ struct sqlite3 {
 #define SQLITE_ColumnCache    0x0002   /* Column cache */
 #define SQLITE_GroupByOrder   0x0004   /* GROUPBY cover of ORDERBY */
 #define SQLITE_FactorOutConst 0x0008   /* Constant factoring */
-#define SQLITE_IdxRealAsInt   0x0010   /* Store REAL as INT in indices */
+/*                not used    0x0010   // Was: SQLITE_IdxRealAsInt */
 #define SQLITE_DistinctOpt    0x0020   /* DISTINCT using indexes */
 #define SQLITE_CoverIdxScan   0x0040   /* Covering index scans */
 #define SQLITE_OrderByIdxJoin 0x0080   /* ORDER BY of joins via index */
index a96b2986610420ff866d7a7b9bc2a1bc51c82cb2..109f90143f743ef8eace353ffad83478134e8dc4 100644 (file)
@@ -6160,7 +6160,6 @@ static int optimization_control(
     { "column-cache",        SQLITE_ColumnCache    },
     { "groupby-order",       SQLITE_GroupByOrder   },
     { "factor-constants",    SQLITE_FactorOutConst },
-    { "real-as-int",         SQLITE_IdxRealAsInt   },
     { "distinct-opt",        SQLITE_DistinctOpt    },
     { "cover-idx-scan",      SQLITE_CoverIdxScan   },
     { "order-by-idx-join",   SQLITE_OrderByIdxJoin },
index 51cf60b52034c041206c8307b9d5a4b744b2513e..46bc89cee87caccc720d829c957d0f3362812423 100644 (file)
@@ -175,6 +175,7 @@ void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3);
 void sqlite3VdbeChangeP5(Vdbe*, u8 P5);
 void sqlite3VdbeJumpHere(Vdbe*, int addr);
 void sqlite3VdbeChangeToNoop(Vdbe*, int addr);
+void sqlite3VdbeDeleteLastOpcode(Vdbe*);
 void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N);
 void sqlite3VdbeSetP4KeyInfo(Parse*, Index*);
 void sqlite3VdbeUsesBtree(Vdbe*, int);
index d917e8540e248ed22cc69e7f5eb8cf9104839477..e0b3c5485f8f0b6787979056c04f790dd9d25bb6 100644 (file)
@@ -726,6 +726,13 @@ void sqlite3VdbeChangeToNoop(Vdbe *p, int addr){
   }
 }
 
+/*
+** Remove the last opcode inserted
+*/
+void sqlite3VdbeDeleteLastOpcode(Vdbe *p){
+  p->nOp--;
+}
+
 /*
 ** Change the value of the P4 operand for a specific instruction.
 ** This routine is useful when a large program is loaded from a