File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / tkt2822.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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.1.1.1 2012/02/21 17:04:16 misho 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>