]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Use the subquery column name, not the original SQL statement text, as the flattener-column-names
authordrh <drh@noemail.net>
Sat, 29 Jul 2017 14:56:53 +0000 (14:56 +0000)
committerdrh <drh@noemail.net>
Sat, 29 Jul 2017 14:56:53 +0000 (14:56 +0000)
added AS clause in the query flattener.

FossilOrigin-Name: 5df7f0e6a1fbc770a68830ce88e78ecccbf023557ea446ce312ab53d5b32a6a9

manifest
manifest.uuid
src/select.c

index 79354a3de23a4f0479f669ee48e8d0c4327e5daf..1a8ff03ee9fcb1b67072bc2f01a2081b5b66d01e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C In\sthe\squery\sflattener,\sonly\sadd\sAS\sclauses\sto\soutput\scolumns\sof\sthe\souter\nquery\sthat\sare\scopied\sdirectly\sfrom\sthe\sinner\squery.\s\sFormerly,\sall\scolumns\nof\sthe\souter\squery\sreceived\san\sAS\sclause\sif\sthey\sdid\snot\shave\sone\salready.\nThis\sis\sa\sproposed\sfix\sfor\sticket\s[de3403bf5ae5f72].
-D 2017-07-29T03:33:21.465
+C Use\sthe\ssubquery\scolumn\sname,\snot\sthe\soriginal\sSQL\sstatement\stext,\sas\sthe\nadded\sAS\sclause\sin\sthe\squery\sflattener.
+D 2017-07-29T14:56:53.996
 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016
@@ -452,7 +452,7 @@ F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20
 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
-F src/select.c 2da6bc6f1dc48ee6f1b7278fefec51185f583e260b326f191e331b0d7faa3272
+F src/select.c ef0be59b8394507c139678a8b6f1c9e8ea028b12200b5e38bc0992560341a035
 F src/shell.c bd6a37cbe8bf64ef6a6a74fdc50f067d3148149b4ce2b4d03154663e66ded55f
 F src/shell.c.in b5725acacba95ccefa57b6d068f710e29ba8239c3aa704628a1902a1f729c175
 F src/sqlite.h.in 0e2603c23f0747c5660669f946e231730af000c76d1653b153dcf2c26fce0a6b
@@ -1637,10 +1637,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P bcec155e0d6c6b17ae09d5a366c080723d01ff40dbc1a0ad0bb669a91db1b850
-R 45c8dd957f6aab7de79a5415e3464bd4
-T *branch * flattener-column-names
-T *sym-flattener-column-names *
-T -sym-trunk *
+P 439cc5c52cbe6e67bbf0b6de0610f7d95ca9eb994f032547dc3535fd2c9dfc78
+R 958b536ad819a7cfdc8789f87ebdcbab
 U drh
-Z 62bad34cdd55bc284474093ae2886434
+Z 4ab6903a815161b50ba952b68c66e144
index 677dd10766fc1b95405bbc405a25da19ef5efa50..41dfdafcde0edf0d314e496819ab47555ccefffc 100644 (file)
@@ -1 +1 @@
-439cc5c52cbe6e67bbf0b6de0610f7d95ca9eb994f032547dc3535fd2c9dfc78
\ No newline at end of file
+5df7f0e6a1fbc770a68830ce88e78ecccbf023557ea446ce312ab53d5b32a6a9
\ No newline at end of file
index 79c23dfcc81e4b28d54e97d5761c58c76c0d4409..05784afcde874b3323325e1ad3d8a4ac8e0d1d24 100644 (file)
@@ -3772,8 +3772,7 @@ static int flattenSubquery(
 
     /* For every result column in the outer query that does not have an AS
     ** clause, if that column is a reference to an output column from the
-    ** inner query, then preserve the name of the column as it was written
-    ** in the original SQL text of the outer query by added an AS clause.
+    ** inner query, then preserve the name of the column by adding an AS clause.
     ** This prevents the outer query column from taking on a name derived
     ** from inner query column name.
     **
@@ -3788,18 +3787,13 @@ static int flattenSubquery(
     ** the programmer expected.  This step adds AS clauses so that the
     ** flattened query becomes:  "SELECT a AS x, b AS y FROM t1".
     **
-    ** This is not a perfect solution.  The added AS clause is the same text as
-    ** the original input SQL.  So if the input SQL used goofy column names
-    ** like "SELECT v1.X,(y) FROM v1", then the added AS clauses will be those
-    ** same goofy colum names "v1.X" and "(y)", not just "x" and "y".  We could
-    ** improve that, but doing so might break lots of legacy code that depends
-    ** on the current behavior which dates back to around 2004.
-    **
-    ** Update on 2017-07-29:  The AS clause is only inserted into outer query
-    ** result columns that get substituted for inner query columns.  Formerly
-    ** an AS clause was added to *all* columns in the outer query that did not
-    ** already have one, even columns that had nothing to do with the inner
-    ** query.
+    ** Update on 2017-07-29:  The current implementation only adds AS clauses
+    ** to outer query result columns that are substituted directly for
+    ** columns of the inner query.  Formerly, all result columns in the outer
+    ** query got new AS clauses if they didn't have them all ready.  Also,
+    ** the name of the AS clause is taken from the result column name of
+    ** the inner query.  Formerly, the name was a copy of the text of the
+    ** original SQL statement that specified the column.
     */
     pList = pParent->pEList;
     for(i=0; i<pList->nExpr; i++){
@@ -3807,9 +3801,10 @@ static int flattenSubquery(
       if( pList->a[i].zName==0
        && (p = pList->a[i].pExpr)->op==TK_COLUMN
        && p->iTable==iParent
+       && p->iColumn>=0
+       && ALWAYS(p->pTab!=0)
       ){
-        char *zName = sqlite3DbStrDup(db, pList->a[i].zSpan);
-        sqlite3Dequote(zName);
+        char *zName = sqlite3DbStrDup(db, p->pTab->aCol[p->iColumn].zName);
         pList->a[i].zName = zName;
       }
     }