Annotation of embedaddon/sqlite3/test/tkt2822.test, revision 1.1

1.1     ! misho       1: # 2007 Dec 4
        !             2: #
        !             3: # The author disclaims copyright to this source code. In place of
        !             4: # a legal notice, here is a blessing:
        !             5: #
        !             6: #    May you do good and not evil.
        !             7: #    May you find forgiveness for yourself and forgive others.
        !             8: #    May you share freely, never taking more than you give.
        !             9: #
        !            10: #***********************************************************************
        !            11: #
        !            12: # This file is to test that the issues surrounding expressions in
        !            13: # ORDER BY clauses on compound SELECT statements raised by ticket
        !            14: # #2822 have been dealt with.
        !            15: #
        !            16: # $Id: tkt2822.test,v 1.6 2008/08/20 16:35:10 drh Exp $
        !            17: #
        !            18: 
        !            19: set testdir [file dirname $argv0]
        !            20: source $testdir/tester.tcl
        !            21: 
        !            22: ifcapable !compound {
        !            23:   finish_test
        !            24:   return
        !            25: }
        !            26: 
        !            27: # The ORDER BY matching algorithm is three steps:
        !            28: # 
        !            29: #   (1)  If the ORDER BY term is an integer constant i, then
        !            30: #        sort by the i-th column of the result set.
        !            31: # 
        !            32: #   (2)  If the ORDER BY term is an identifier (not x.y or x.y.z
        !            33: #        but simply x) then look for a column alias with the same
        !            34: #        name.  If found, then sort by that column.
        !            35: # 
        !            36: #   (3)  Evaluate the term as an expression and sort by the
        !            37: #        value of the expression.
        !            38: # 
        !            39: # For a compound SELECT the rules are modified slightly.
        !            40: # In the third rule, the expression must exactly match one
        !            41: # of the result columns.  The sequences of three rules is
        !            42: # attempted first on the left-most SELECT.  If that doesn't
        !            43: # work, we move to the right, one by one.
        !            44: #
        !            45: # Rule (3) is not in standard SQL - it is an SQLite extension,
        !            46: # though one copied from PostgreSQL.  The rule for compound
        !            47: # queries where a search is made of SELECTs to the right
        !            48: # if the left-most SELECT does not match is not a part of
        !            49: # standard SQL either.  This extension is unique to SQLite
        !            50: # as far as we know.
        !            51: #
        !            52: # Rule (2) was added by the changes ticket #2822.  Prior to
        !            53: # that changes, SQLite did not support rule (2), making it
        !            54: # technically in violation of standard SQL semantics.  
        !            55: # No body noticed because rule (3) has the same effect as
        !            56: # rule (2) except in some obscure cases.
        !            57: #
        !            58: 
        !            59: 
        !            60: # Test plan:
        !            61: #
        !            62: #   tkt2822-1.* - Simple identifier as ORDER BY expression.
        !            63: #   tkt2822-2.* - More complex ORDER BY expressions.
        !            64: 
        !            65: do_test tkt2822-0.1 {
        !            66:   execsql {
        !            67:     CREATE TABLE t1(a, b, c);
        !            68:     CREATE TABLE t2(a, b, c);
        !            69: 
        !            70:     INSERT INTO t1 VALUES(1, 3, 9);
        !            71:     INSERT INTO t1 VALUES(3, 9, 27);
        !            72:     INSERT INTO t1 VALUES(5, 15, 45);
        !            73: 
        !            74:     INSERT INTO t2 VALUES(2, 6, 18);
        !            75:     INSERT INTO t2 VALUES(4, 12, 36);
        !            76:     INSERT INTO t2 VALUES(6, 18, 54);
        !            77:   }
        !            78: } {}
        !            79: 
        !            80: # Test the "ORDER BY <integer>" syntax.
        !            81: #
        !            82: do_test tkt2822-1.1 {
        !            83:   execsql {
        !            84:     SELECT a, b, c FROM t1 UNION ALL SELECT a, b, c FROM t2 ORDER BY 1;
        !            85:   }
        !            86: } {1 3 9 2 6 18 3 9 27 4 12 36 5 15 45 6 18 54}
        !            87: do_test tkt2822-1.2 {
        !            88:   execsql {
        !            89:     SELECT a, CAST (b AS TEXT), c FROM t1 
        !            90:       UNION ALL 
        !            91:     SELECT a, b, c FROM t2 
        !            92:       ORDER BY 2;
        !            93:   }
        !            94: } {2 6 18 4 12 36 6 18 54 5 15 45 1 3 9 3 9 27}
        !            95: 
        !            96: # Test the "ORDER BY <identifier>" syntax.
        !            97: #
        !            98: do_test tkt2822-2.1 {
        !            99:   execsql {
        !           100:     SELECT a, b, c FROM t1 UNION ALL SELECT a, b, c FROM t2 ORDER BY a;
        !           101:   }
        !           102: } {1 3 9 2 6 18 3 9 27 4 12 36 5 15 45 6 18 54}
        !           103: 
        !           104: do_test tkt2822-2.2 {
        !           105:   execsql {
        !           106:     SELECT a, CAST (b AS TEXT) AS x, c FROM t1 
        !           107:       UNION ALL 
        !           108:     SELECT a, b, c FROM t2 
        !           109:       ORDER BY x;
        !           110:   }
        !           111: } {2 6 18 4 12 36 6 18 54 5 15 45 1 3 9 3 9 27}
        !           112: do_test tkt2822-2.3 {
        !           113:   execsql {
        !           114:     SELECT t1.a, b, c FROM t1 UNION ALL SELECT t2.a, b, c FROM t2 ORDER BY a;
        !           115:   }
        !           116: } {1 3 9 2 6 18 3 9 27 4 12 36 5 15 45 6 18 54}
        !           117: 
        !           118: # Test the "ORDER BY <expression>" syntax.
        !           119: #
        !           120: do_test tkt2822-3.1 {
        !           121:   execsql {
        !           122:     SELECT a, CAST (b AS TEXT) AS x, c FROM t1 
        !           123:       UNION ALL 
        !           124:     SELECT a, b, c FROM t2 
        !           125:       ORDER BY CAST (b AS TEXT);
        !           126:   }
        !           127: } {2 6 18 4 12 36 6 18 54 5 15 45 1 3 9 3 9 27}
        !           128: do_test tkt2822-3.2 {
        !           129:   execsql {
        !           130:     SELECT t1.a, b, c FROM t1 UNION ALL SELECT t2.a, b, c FROM t2 ORDER BY t1.a;
        !           131:   }
        !           132: } {1 3 9 2 6 18 3 9 27 4 12 36 5 15 45 6 18 54}
        !           133: 
        !           134: # Test that if a match cannot be found in the leftmost SELECT, an
        !           135: # attempt is made to find a match in subsequent SELECT statements.
        !           136: #
        !           137: do_test tkt2822-3.3 {
        !           138:   execsql {
        !           139:     SELECT a, b, c FROM t1 UNION ALL SELECT a AS x, b, c FROM t2 ORDER BY x;
        !           140:   }
        !           141: } {1 3 9 2 6 18 3 9 27 4 12 36 5 15 45 6 18 54}
        !           142: do_test tkt2822-3.4 {
        !           143:   # But the leftmost SELECT takes precedence.
        !           144:   execsql {
        !           145:     SELECT a AS b, CAST (b AS TEXT) AS a, c FROM t1 
        !           146:       UNION ALL 
        !           147:     SELECT a, b, c FROM t2 
        !           148:       ORDER BY a;
        !           149:   }
        !           150: } {2 6 18 4 12 36 6 18 54 5 15 45 1 3 9 3 9 27}
        !           151: do_test tkt2822-3.5 {
        !           152:   execsql {
        !           153:     SELECT a, b, c FROM t2 
        !           154:       UNION ALL 
        !           155:     SELECT a AS b, CAST (b AS TEXT) AS a, c FROM t1 
        !           156:       ORDER BY a;
        !           157:   }
        !           158: } {1 3 9 2 6 18 3 9 27 4 12 36 5 15 45 6 18 54}
        !           159: 
        !           160: # Test some error conditions (ORDER BY clauses that match no column).
        !           161: #
        !           162: do_test tkt2822-4.1 {
        !           163:   catchsql {
        !           164:     SELECT a, b, c FROM t1 UNION ALL SELECT a, b, c FROM t2 ORDER BY x
        !           165:   }
        !           166: } {1 {1st ORDER BY term does not match any column in the result set}}
        !           167: do_test tkt2822-4.2 {
        !           168:   catchsql {
        !           169:     SELECT a, CAST (b AS TEXT) AS x, c FROM t1 
        !           170:       UNION ALL 
        !           171:     SELECT a, b, c FROM t2 
        !           172:       ORDER BY CAST (b AS INTEGER);
        !           173:   }
        !           174: } {1 {1st ORDER BY term does not match any column in the result set}}
        !           175: 
        !           176: # Tests for rule (2).
        !           177: #
        !           178: # The "ORDER BY b" should match the column alias (rule 2), not the
        !           179: # the t3.b value (rule 3).  
        !           180: #
        !           181: do_test tkt2822-5.1 {
        !           182:   execsql {
        !           183:     CREATE TABLE t3(a,b);
        !           184:     INSERT INTO t3 VALUES(1,8);
        !           185:     INSERT INTO t3 VALUES(9,2);
        !           186: 
        !           187:     SELECT a AS b FROM t3 ORDER BY b;
        !           188:   }
        !           189: } {1 9}
        !           190: do_test tkt2822-5.2 {
        !           191:   # Case does not matter.  b should match B
        !           192:   execsql {
        !           193:     SELECT a AS b FROM t3 ORDER BY B;
        !           194:   }
        !           195: } {1 9}
        !           196: do_test tkt2822-5.3 {
        !           197:   # Quoting should not matter
        !           198:   execsql {
        !           199:     SELECT a AS 'b' FROM t3 ORDER BY "B";
        !           200:   }
        !           201: } {1 9}
        !           202: do_test tkt2822-5.4 {
        !           203:   # Quoting should not matter
        !           204:   execsql {
        !           205:     SELECT a AS "b" FROM t3 ORDER BY [B];
        !           206:   }
        !           207: } {1 9}
        !           208: 
        !           209: # In "ORDER BY +b" the term is now an expression rather than
        !           210: # a label.  It therefore matches by rule (3) instead of rule (2).
        !           211: # 
        !           212: do_test tkt2822-5.5 {
        !           213:   execsql {
        !           214:     SELECT a AS b FROM t3 ORDER BY +b;
        !           215:   }
        !           216: } {9 1}
        !           217: 
        !           218: # Tests for rule 2 in compound queries
        !           219: #
        !           220: do_test tkt2822-6.1 {
        !           221:   execsql {
        !           222:     CREATE TABLE t6a(p,q);
        !           223:     INSERT INTO t6a VALUES(1,8);
        !           224:     INSERT INTO t6a VALUES(9,2);
        !           225:     CREATE TABLE t6b(x,y);
        !           226:     INSERT INTO t6b VALUES(1,7);
        !           227:     INSERT INTO t6b VALUES(7,2);
        !           228: 
        !           229:     SELECT p, q FROM t6a UNION ALL SELECT x, y FROM t6b ORDER BY 1, 2
        !           230:   }
        !           231: } {1 7 1 8 7 2 9 2}
        !           232: do_test tkt2822-6.2 {
        !           233:   execsql {
        !           234:     SELECT p PX, q QX FROM t6a UNION ALL SELECT x XX, y YX FROM t6b
        !           235:     ORDER BY PX, YX
        !           236:   }
        !           237: } {1 7 1 8 7 2 9 2}
        !           238: do_test tkt2822-6.3 {
        !           239:   execsql {
        !           240:     SELECT p PX, q QX FROM t6a UNION ALL SELECT x XX, y YX FROM t6b
        !           241:     ORDER BY XX, QX
        !           242:   }
        !           243: } {1 7 1 8 7 2 9 2}
        !           244: do_test tkt2822-6.4 {
        !           245:   execsql {
        !           246:     SELECT p PX, q QX FROM t6a UNION ALL SELECT x XX, y YX FROM t6b
        !           247:     ORDER BY QX, XX
        !           248:   }
        !           249: } {7 2 9 2 1 7 1 8}
        !           250: do_test tkt2822-6.5 {
        !           251:   execsql {
        !           252:     SELECT p PX, q QX FROM t6a UNION ALL SELECT x XX, y YX FROM t6b
        !           253:     ORDER BY t6b.x, QX
        !           254:   }
        !           255: } {1 7 1 8 7 2 9 2}
        !           256: do_test tkt2822-6.6 {
        !           257:   execsql {
        !           258:     SELECT p PX, q QX FROM t6a UNION ALL SELECT x XX, y YX FROM t6b
        !           259:     ORDER BY t6a.q, XX
        !           260:   }
        !           261: } {7 2 9 2 1 7 1 8}
        !           262: 
        !           263: # More error message tests.  This is really more of a test of the
        !           264: # %r ordinal value formatting capablity added to sqlite3_snprintf()
        !           265: # by ticket #2822.
        !           266: #
        !           267: do_test tkt2822-7.1 {
        !           268:   execsql {
        !           269:     CREATE TABLE t7(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,
        !           270:                     a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25);
        !           271:   }
        !           272:   catchsql {
        !           273:     SELECT * FROM t7 ORDER BY 0;
        !           274:   }
        !           275: } {1 {1st ORDER BY term out of range - should be between 1 and 25}}
        !           276: do_test tkt2822-7.2 {
        !           277:   catchsql {
        !           278:     SELECT * FROM t7 ORDER BY 1, 0;
        !           279:   }
        !           280: } {1 {2nd ORDER BY term out of range - should be between 1 and 25}}
        !           281: do_test tkt2822-7.3 {
        !           282:   catchsql {
        !           283:     SELECT * FROM t7 ORDER BY 1, 2, 0;
        !           284:   }
        !           285: } {1 {3rd ORDER BY term out of range - should be between 1 and 25}}
        !           286: do_test tkt2822-7.4 {
        !           287:   catchsql {
        !           288:     SELECT * FROM t7 ORDER BY 1, 2, 3, 0;
        !           289:   }
        !           290: } {1 {4th ORDER BY term out of range - should be between 1 and 25}}
        !           291: do_test tkt2822-7.9 {
        !           292:   catchsql {
        !           293:     SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 0;
        !           294:   }
        !           295: } {1 {9th ORDER BY term out of range - should be between 1 and 25}}
        !           296: do_test tkt2822-7.10 {
        !           297:   catchsql {
        !           298:     SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 0;
        !           299:   }
        !           300: } {1 {10th ORDER BY term out of range - should be between 1 and 25}}
        !           301: do_test tkt2822-7.11 {
        !           302:   catchsql {
        !           303:     SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0;
        !           304:   }
        !           305: } {1 {11th ORDER BY term out of range - should be between 1 and 25}}
        !           306: do_test tkt2822-7.12 {
        !           307:   catchsql {
        !           308:     SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 0;
        !           309:   }
        !           310: } {1 {12th ORDER BY term out of range - should be between 1 and 25}}
        !           311: do_test tkt2822-7.13 {
        !           312:   catchsql {
        !           313:     SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 0;
        !           314:   }
        !           315: } {1 {13th ORDER BY term out of range - should be between 1 and 25}}
        !           316: do_test tkt2822-7.20 {
        !           317:   catchsql {
        !           318:     SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
        !           319:                              11,12,13,14,15,16,17,18,19, 0
        !           320:   }
        !           321: } {1 {20th ORDER BY term out of range - should be between 1 and 25}}
        !           322: do_test tkt2822-7.21 {
        !           323:   catchsql {
        !           324:     SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
        !           325:                              11,12,13,14,15,16,17,18,19, 20, 0
        !           326:   }
        !           327: } {1 {21st ORDER BY term out of range - should be between 1 and 25}}
        !           328: do_test tkt2822-7.22 {
        !           329:   catchsql {
        !           330:     SELECT * FROM t7 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
        !           331:                              11,12,13,14,15,16,17,18,19, 20, 21, 0
        !           332:   }
        !           333: } {1 {22nd ORDER BY term out of range - should be between 1 and 25}}
        !           334: 
        !           335: 
        !           336: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>