]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not release registers used to hold the results of a compound select
authordrh <drh@noemail.net>
Wed, 6 Feb 2008 23:52:36 +0000 (23:52 +0000)
committerdrh <drh@noemail.net>
Wed, 6 Feb 2008 23:52:36 +0000 (23:52 +0000)
after just the first select has run.  Ticket #2927.  For now, we will
never release the registers used to hold the result set, since the same
register set will be used for each select.  This is not an unacceptable
register leak and it is the safest approach. (CVS 4778)

FossilOrigin-Name: e9fcb793998be07eaea01404407087b71c29853d

manifest
manifest.uuid
src/select.c
test/tkt2927.test [new file with mode: 0644]

index dee122d728a9fa42438768e9e25251f011193e88..b1d7fd604d1f32f6f1f73743eb2d425565bc2a4b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Version\s3.5.6\s(CVS\s4777)
-D 2008-02-06T16:58:28
+C Do\snot\srelease\sregisters\sused\sto\shold\sthe\sresults\sof\sa\scompound\sselect\nafter\sjust\sthe\sfirst\sselect\shas\srun.\s\sTicket\s#2927.\s\sFor\snow,\swe\swill\nnever\srelease\sthe\sregisters\sused\sto\shold\sthe\sresult\sset,\ssince\sthe\ssame\nregister\sset\swill\sbe\sused\sfor\seach\sselect.\s\sThis\sis\snot\san\sunacceptable\nregister\sleak\sand\sit\sis\sthe\ssafest\sapproach.\s(CVS\s4778)
+D 2008-02-06T23:52:37
 F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
 F Makefile.in bc2b5df3e3d0d4b801b824b7ef6dec43812b049b
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -132,7 +132,7 @@ F src/pragma.c 2bb8d6882b9a330e041acd05fb6aff5a01bf0a08
 F src/prepare.c 1b0601ca3f97a9d253cc08697484e3045a1678e9
 F src/printf.c eb27822ba2eec669161409ca31279a24c26ac910
 F src/random.c 02ef38b469237482f1ea14a78b2087cfbaec48bd
-F src/select.c 1a5d0aaf8f420b164eb775d3b1ba2bfb79597f65
+F src/select.c 394aa3542e8df599dcca77b0e75f7875760a13ad
 F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96
 F src/shell.c ca06cb687c40a8bff6307b5fad41a0e86a0f8558
 F src/sqlite.h.in 690736613958e0f462e08ae2a9136fa335214edc
@@ -495,6 +495,7 @@ F test/tkt2822.test 8b1526b1e5b0d38a1a993f7828fbb81759093686
 F test/tkt2832.test cd56dc66bb31898b7eb2146baa5bde2eb80f96fe
 F test/tkt2854.test aebd5a9904d36d1ef7a074fc5e7c7da3ab00c32a
 F test/tkt2920.test a8737380e4ae6424e00c0273dc12775704efbebf
+F test/tkt2927.test 492c6a9a14b2fc7bdbb17ce8e497d82df627f64d
 F test/trace.test 951cd0f5f571e7f36bf7bfe04be70f90fb16fb00
 F test/trans.test b73289992b46d38d9479ecc4fdc03d8edb2413dc
 F test/trigger1.test 7c13f39ca36f529bf856e05c7d004fc0531d48b4
@@ -615,7 +616,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P 3444efabfc3d9a30b7ef22f40ecfa401d033d43f
-R 73930ec2f92f5a7b40b836d05a1f5880
+P 1d82ab6987e567fff051cf4dd7b1a0bf6d174145
+R 27d406015aaf8a169469efe427569dc7
 U drh
-Z 984cc6ab4f49b36fd57cbb663a11c64f
+Z f7375f9f0a761af4d5cb2ddfe36898ea
index 28153c2d9aa184654817fc945cd965bcfd077ef0..d7e89c1850c8502fa40c0a06c28017ea218c9bc2 100644 (file)
@@ -1 +1 @@
-1d82ab6987e567fff051cf4dd7b1a0bf6d174145
\ No newline at end of file
+e9fcb793998be07eaea01404407087b71c29853d
\ No newline at end of file
index 981691f61c011aedd049a2d7a0eab87bce0f1b17..590f6e6850b3198b2b8346051435f22aafc30aad 100644 (file)
@@ -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.411 2008/01/25 15:04:50 drh Exp $
+** $Id: select.c,v 1.412 2008/02/06 23:52:37 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -522,7 +522,6 @@ static void selectInnerLoop(
   int eDest = pDest->eDest;   /* How to dispose of results */
   int iParm = pDest->iParm;   /* First argument to disposal method */
   int nResultCol;             /* Number of result columns */
-  int nToFree;                /* Number of result columns to release */
 
   if( v==0 ) return;
   assert( pEList!=0 );
@@ -542,13 +541,10 @@ static void selectInnerLoop(
   }else{
     nResultCol = pEList->nExpr;
   }
-  if( pDest->iMem>0 ){
-    regResult = pDest->iMem;
-    nToFree = 0;
-  }else{
-    pDest->iMem = regResult = sqlite3GetTempRange(pParse, nResultCol);
-    nToFree = nResultCol;
+  if( pDest->iMem==0 ){
+    pDest->iMem = sqlite3GetTempRange(pParse, nResultCol);
   }
+  regResult = pDest->iMem;
   if( nColumn>0 ){
     for(i=0; i<nColumn; i++){
       sqlite3VdbeAddOp3(v, OP_Column, srcTab, i, regResult+i);
@@ -694,7 +690,6 @@ static void selectInnerLoop(
         pushOntoSorter(pParse, pOrderBy, p, r1);
         sqlite3ReleaseTempReg(pParse, r1);
       }else if( eDest==SRT_Subroutine ){
-        nToFree = 0;  /* Preserve registers. Subroutine will need them. */
         sqlite3VdbeAddOp2(v, OP_Gosub, 0, iParm);
       }else{
         sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nColumn);
@@ -721,7 +716,6 @@ static void selectInnerLoop(
     sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1);
     sqlite3VdbeAddOp2(v, OP_IfZero, p->iLimit, iBreak);
   }
-  sqlite3ReleaseTempRange(pParse, regResult, nToFree);
 }
 
 /*
diff --git a/test/tkt2927.test b/test/tkt2927.test
new file mode 100644 (file)
index 0000000..d72aad7
--- /dev/null
@@ -0,0 +1,638 @@
+# 2008 Feb 6
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# This file is to test that ticket #2927 is fixed.
+#
+# $Id: tkt2927.test,v 1.1 2008/02/06 23:52:37 drh Exp $
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+# Create a database.
+#
+do_test tkt2927-1.1 {
+  db eval {
+    CREATE TABLE t1(a, b);
+    INSERT INTO t1 VALUES(1,11);
+    INSERT INTO t1 VALUES(2,22);
+    INSERT INTO t1 VALUES(3,33);
+    INSERT INTO t1 VALUES(4,44);
+    INSERT INTO t1 VALUES(5,55);
+    SELECT * FROM t1;
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+
+
+do_test tkt2927-2.1 {
+  db eval {
+    SELECT a, b FROM t1
+    UNION ALL
+    SELECT a, b FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.2 {
+breakpoint
+#set sqlite_addop_trace 1
+  db eval {
+    SELECT a, b FROM t1
+    UNION ALL
+    SELECT a, abs(b) FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.3 {
+  db eval {
+    SELECT a, b FROM t1
+    UNION ALL
+    SELECT abs(a), b FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.4 {
+  db eval {
+    SELECT a, b FROM t1
+    UNION ALL
+    SELECT abs(a), abs(b) FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.5 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    UNION ALL
+    SELECT a, b FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.6 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    UNION ALL
+    SELECT a, abs(b) FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.7 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    UNION ALL
+    SELECT abs(a), b FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.8 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    UNION ALL
+    SELECT abs(a), abs(b) FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.9 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    UNION ALL
+    SELECT a, b FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.10 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    UNION ALL
+    SELECT a, abs(b) FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.11 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    UNION ALL
+    SELECT abs(a), b FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.12 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    UNION ALL
+    SELECT abs(a), abs(b) FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.13 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    UNION ALL
+    SELECT a, b FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.14 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    UNION ALL
+    SELECT a, abs(b) FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.15 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    UNION ALL
+    SELECT abs(a), b FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-2.16 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    UNION ALL
+    SELECT abs(a), abs(b) FROM t1
+  }
+} {1 11 2 22 3 33 4 44 5 55 1 11 2 22 3 33 4 44 5 55}
+
+
+do_test tkt2927-3.1 {
+  db eval {
+    SELECT a, b FROM t1
+    UNION 
+    SELECT a, b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.2 {
+  db eval {
+    SELECT a, b FROM t1
+    UNION 
+    SELECT a, abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.3 {
+  db eval {
+    SELECT a, b FROM t1
+    UNION 
+    SELECT abs(a), b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.4 {
+  db eval {
+    SELECT a, b FROM t1
+    UNION 
+    SELECT abs(a), abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.5 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    UNION 
+    SELECT a, b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.6 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    UNION 
+    SELECT a, abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.7 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    UNION 
+    SELECT abs(a), b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.8 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    UNION 
+    SELECT abs(a), abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.9 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    UNION 
+    SELECT a, b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.10 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    UNION 
+    SELECT a, abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.11 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    UNION 
+    SELECT abs(a), b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.12 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    UNION 
+    SELECT abs(a), abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.13 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    UNION 
+    SELECT a, b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.14 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    UNION 
+    SELECT a, abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.15 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    UNION 
+    SELECT abs(a), b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-3.16 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    UNION 
+    SELECT abs(a), abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+
+
+do_test tkt2927-4.1 {
+  db eval {
+    SELECT a+b, a-b, a, b FROM t1
+    UNION ALL
+    SELECT a+b, a-b, a, b FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.2 {
+  db eval {
+    SELECT a+b, a-b, a, b FROM t1
+    UNION ALL
+    SELECT a+b, a-b, a, abs(b) FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.3 {
+  db eval {
+    SELECT a+b, a-b, a, b FROM t1
+    UNION ALL
+    SELECT a+b, a-b, abs(a), b FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.4 {
+  db eval {
+    SELECT a+b, a-b, a, b FROM t1
+    UNION ALL
+    SELECT a+b, a-b, abs(a), abs(b) FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.5 {
+  db eval {
+    SELECT a+b, a-b, a, abs(b) FROM t1
+    UNION ALL
+    SELECT a+b, a-b, a, b FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.6 {
+  db eval {
+    SELECT a+b, a-b, a, abs(b) FROM t1
+    UNION ALL
+    SELECT a+b, a-b, a, abs(b) FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.7 {
+  db eval {
+    SELECT a+b, a-b, a, abs(b) FROM t1
+    UNION ALL
+    SELECT a+b, a-b, abs(a), b FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.8 {
+  db eval {
+    SELECT a+b, a-b, a, abs(b) FROM t1
+    UNION ALL
+    SELECT a+b, a-b, abs(a), abs(b) FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.9 {
+  db eval {
+    SELECT a+b, a-b, abs(a), b FROM t1
+    UNION ALL
+    SELECT a+b, a-b, a, b FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.10 {
+  db eval {
+    SELECT a+b, a-b, abs(a), b FROM t1
+    UNION ALL
+    SELECT a+b, a-b, a, abs(b) FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.11 {
+  db eval {
+    SELECT a+b, a-b, abs(a), b FROM t1
+    UNION ALL
+    SELECT a+b, a-b, abs(a), b FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.12 {
+  db eval {
+    SELECT a+b, a-b, abs(a), b FROM t1
+    UNION ALL
+    SELECT a+b, a-b, abs(a), abs(b) FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.13 {
+  db eval {
+    SELECT a+b, a-b, abs(a), abs(b) FROM t1
+    UNION ALL
+    SELECT a+b, a-b, a, b FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.14 {
+  db eval {
+    SELECT a+b, a-b, abs(a), abs(b) FROM t1
+    UNION ALL
+    SELECT a+b, a-b, a, abs(b) FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.15 {
+  db eval {
+    SELECT a+b, a-b, abs(a), abs(b) FROM t1
+    UNION ALL
+    SELECT a+b, a-b, abs(a), b FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+do_test tkt2927-4.16 {
+  db eval {
+    SELECT a+b, a-b, abs(a), abs(b) FROM t1
+    UNION ALL
+    SELECT a+b, a-b, abs(a), abs(b) FROM t1
+  }
+} {12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55 12 -10 1 11 24 -20 2 22 36 -30 3 33 48 -40 4 44 60 -50 5 55}
+
+
+do_test tkt2927-5.1 {
+  db eval {
+    SELECT a, b FROM t1
+    EXCEPT
+    SELECT a, b FROM t1
+  }
+} {}
+do_test tkt2927-5.2 {
+  db eval {
+    SELECT a, b FROM t1
+    EXCEPT
+    SELECT a, abs(b) FROM t1
+  }
+} {}
+do_test tkt2927-5.3 {
+  db eval {
+    SELECT a, b FROM t1
+    EXCEPT
+    SELECT abs(a), b FROM t1
+  }
+} {}
+do_test tkt2927-5.4 {
+  db eval {
+    SELECT a, b FROM t1
+    EXCEPT
+    SELECT abs(a), abs(b) FROM t1
+  }
+} {}
+do_test tkt2927-5.5 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    EXCEPT
+    SELECT a, b FROM t1
+  }
+} {}
+do_test tkt2927-5.6 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    EXCEPT
+    SELECT a, abs(b) FROM t1
+  }
+} {}
+do_test tkt2927-5.7 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    EXCEPT
+    SELECT abs(a), b FROM t1
+  }
+} {}
+do_test tkt2927-5.8 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    EXCEPT
+    SELECT abs(a), abs(b) FROM t1
+  }
+} {}
+do_test tkt2927-5.9 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    EXCEPT
+    SELECT a, b FROM t1
+  }
+} {}
+do_test tkt2927-5.10 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    EXCEPT
+    SELECT a, abs(b) FROM t1
+  }
+} {}
+do_test tkt2927-5.11 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    EXCEPT
+    SELECT abs(a), b FROM t1
+  }
+} {}
+do_test tkt2927-5.12 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    EXCEPT
+    SELECT abs(a), abs(b) FROM t1
+  }
+} {}
+do_test tkt2927-5.13 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    EXCEPT
+    SELECT a, b FROM t1
+  }
+} {}
+do_test tkt2927-5.14 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    EXCEPT
+    SELECT a, abs(b) FROM t1
+  }
+} {}
+do_test tkt2927-5.15 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    EXCEPT
+    SELECT abs(a), b FROM t1
+  }
+} {}
+do_test tkt2927-5.16 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    EXCEPT
+    SELECT abs(a), abs(b) FROM t1
+  }
+} {}
+
+
+do_test tkt2927-6.1 {
+  db eval {
+    SELECT a, b FROM t1
+    INTERSECT
+    SELECT a, b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.2 {
+  db eval {
+    SELECT a, b FROM t1
+    INTERSECT
+    SELECT a, abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.3 {
+  db eval {
+    SELECT a, b FROM t1
+    INTERSECT
+    SELECT abs(a), b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.4 {
+  db eval {
+    SELECT a, b FROM t1
+    INTERSECT
+    SELECT abs(a), abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.5 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    INTERSECT
+    SELECT a, b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.6 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    INTERSECT
+    SELECT a, abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.7 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    INTERSECT
+    SELECT abs(a), b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.8 {
+  db eval {
+    SELECT a, abs(b) FROM t1
+    INTERSECT
+    SELECT abs(a), abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.9 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    INTERSECT
+    SELECT a, b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.10 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    INTERSECT
+    SELECT a, abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.11 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    INTERSECT
+    SELECT abs(a), b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.12 {
+  db eval {
+    SELECT abs(a), b FROM t1
+    INTERSECT
+    SELECT abs(a), abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.13 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    INTERSECT
+    SELECT a, b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.14 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    INTERSECT
+    SELECT a, abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.15 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    INTERSECT
+    SELECT abs(a), b FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+do_test tkt2927-6.16 {
+  db eval {
+    SELECT abs(a), abs(b) FROM t1
+    INTERSECT
+    SELECT abs(a), abs(b) FROM t1
+    ORDER BY 1
+  }
+} {1 11 2 22 3 33 4 44 5 55}
+
+finish_test