os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/select4.test
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200 (2012-06-15)
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
# 2001 September 15
sl@0
     2
#
sl@0
     3
# The author disclaims copyright to this source code.  In place of
sl@0
     4
# a legal notice, here is a blessing:
sl@0
     5
#
sl@0
     6
#    May you do good and not evil.
sl@0
     7
#    May you find forgiveness for yourself and forgive others.
sl@0
     8
#    May you share freely, never taking more than you give.
sl@0
     9
#
sl@0
    10
#***********************************************************************
sl@0
    11
# This file implements regression tests for SQLite library.  The
sl@0
    12
# focus of this file is testing UNION, INTERSECT and EXCEPT operators
sl@0
    13
# in SELECT statements.
sl@0
    14
#
sl@0
    15
# $Id: select4.test,v 1.29 2008/08/04 03:51:24 danielk1977 Exp $
sl@0
    16
sl@0
    17
set testdir [file dirname $argv0]
sl@0
    18
source $testdir/tester.tcl
sl@0
    19
sl@0
    20
# Most tests in this file depend on compound-select. But there are a couple
sl@0
    21
# right at the end that test DISTINCT, so we cannot omit the entire file.
sl@0
    22
#
sl@0
    23
ifcapable compound {
sl@0
    24
sl@0
    25
# Build some test data
sl@0
    26
#
sl@0
    27
execsql {
sl@0
    28
  CREATE TABLE t1(n int, log int);
sl@0
    29
  BEGIN;
sl@0
    30
}
sl@0
    31
for {set i 1} {$i<32} {incr i} {
sl@0
    32
  for {set j 0} {(1<<$j)<$i} {incr j} {}
sl@0
    33
  execsql "INSERT INTO t1 VALUES($i,$j)"
sl@0
    34
}
sl@0
    35
execsql {
sl@0
    36
  COMMIT;
sl@0
    37
}
sl@0
    38
sl@0
    39
do_test select4-1.0 {
sl@0
    40
  execsql {SELECT DISTINCT log FROM t1 ORDER BY log}
sl@0
    41
} {0 1 2 3 4 5}
sl@0
    42
sl@0
    43
# Union All operator
sl@0
    44
#
sl@0
    45
do_test select4-1.1a {
sl@0
    46
  lsort [execsql {SELECT DISTINCT log FROM t1}]
sl@0
    47
} {0 1 2 3 4 5}
sl@0
    48
do_test select4-1.1b {
sl@0
    49
  lsort [execsql {SELECT n FROM t1 WHERE log=3}]
sl@0
    50
} {5 6 7 8}
sl@0
    51
do_test select4-1.1c {
sl@0
    52
  execsql {
sl@0
    53
    SELECT DISTINCT log FROM t1
sl@0
    54
    UNION ALL
sl@0
    55
    SELECT n FROM t1 WHERE log=3
sl@0
    56
    ORDER BY log;
sl@0
    57
  }
sl@0
    58
} {0 1 2 3 4 5 5 6 7 8}
sl@0
    59
do_test select4-1.1d {
sl@0
    60
  execsql {
sl@0
    61
    CREATE TABLE t2 AS
sl@0
    62
      SELECT DISTINCT log FROM t1
sl@0
    63
      UNION ALL
sl@0
    64
      SELECT n FROM t1 WHERE log=3
sl@0
    65
      ORDER BY log;
sl@0
    66
    SELECT * FROM t2;
sl@0
    67
  }
sl@0
    68
} {0 1 2 3 4 5 5 6 7 8}
sl@0
    69
execsql {DROP TABLE t2}
sl@0
    70
do_test select4-1.1e {
sl@0
    71
  execsql {
sl@0
    72
    CREATE TABLE t2 AS
sl@0
    73
      SELECT DISTINCT log FROM t1
sl@0
    74
      UNION ALL
sl@0
    75
      SELECT n FROM t1 WHERE log=3
sl@0
    76
      ORDER BY log DESC;
sl@0
    77
    SELECT * FROM t2;
sl@0
    78
  }
sl@0
    79
} {8 7 6 5 5 4 3 2 1 0}
sl@0
    80
execsql {DROP TABLE t2}
sl@0
    81
do_test select4-1.1f {
sl@0
    82
  execsql {
sl@0
    83
    SELECT DISTINCT log FROM t1
sl@0
    84
    UNION ALL
sl@0
    85
    SELECT n FROM t1 WHERE log=2
sl@0
    86
  }
sl@0
    87
} {0 1 2 3 4 5 3 4}
sl@0
    88
do_test select4-1.1g {
sl@0
    89
  execsql {
sl@0
    90
    CREATE TABLE t2 AS 
sl@0
    91
      SELECT DISTINCT log FROM t1
sl@0
    92
      UNION ALL
sl@0
    93
      SELECT n FROM t1 WHERE log=2;
sl@0
    94
    SELECT * FROM t2;
sl@0
    95
  }
sl@0
    96
} {0 1 2 3 4 5 3 4}
sl@0
    97
execsql {DROP TABLE t2}
sl@0
    98
ifcapable subquery {
sl@0
    99
  do_test select4-1.2 {
sl@0
   100
    execsql {
sl@0
   101
      SELECT log FROM t1 WHERE n IN 
sl@0
   102
        (SELECT DISTINCT log FROM t1 UNION ALL
sl@0
   103
         SELECT n FROM t1 WHERE log=3)
sl@0
   104
      ORDER BY log;
sl@0
   105
    }
sl@0
   106
  } {0 1 2 2 3 3 3 3}
sl@0
   107
}
sl@0
   108
do_test select4-1.3 {
sl@0
   109
  set v [catch {execsql {
sl@0
   110
    SELECT DISTINCT log FROM t1 ORDER BY log
sl@0
   111
    UNION ALL
sl@0
   112
    SELECT n FROM t1 WHERE log=3
sl@0
   113
    ORDER BY log;
sl@0
   114
  }} msg]
sl@0
   115
  lappend v $msg
sl@0
   116
} {1 {ORDER BY clause should come after UNION ALL not before}}
sl@0
   117
sl@0
   118
# Union operator
sl@0
   119
#
sl@0
   120
do_test select4-2.1 {
sl@0
   121
  execsql {
sl@0
   122
    SELECT DISTINCT log FROM t1
sl@0
   123
    UNION
sl@0
   124
    SELECT n FROM t1 WHERE log=3
sl@0
   125
    ORDER BY log;
sl@0
   126
  }
sl@0
   127
} {0 1 2 3 4 5 6 7 8}
sl@0
   128
ifcapable subquery {
sl@0
   129
  do_test select4-2.2 {
sl@0
   130
    execsql {
sl@0
   131
      SELECT log FROM t1 WHERE n IN 
sl@0
   132
        (SELECT DISTINCT log FROM t1 UNION
sl@0
   133
         SELECT n FROM t1 WHERE log=3)
sl@0
   134
      ORDER BY log;
sl@0
   135
    }
sl@0
   136
  } {0 1 2 2 3 3 3 3}
sl@0
   137
}
sl@0
   138
do_test select4-2.3 {
sl@0
   139
  set v [catch {execsql {
sl@0
   140
    SELECT DISTINCT log FROM t1 ORDER BY log
sl@0
   141
    UNION
sl@0
   142
    SELECT n FROM t1 WHERE log=3
sl@0
   143
    ORDER BY log;
sl@0
   144
  }} msg]
sl@0
   145
  lappend v $msg
sl@0
   146
} {1 {ORDER BY clause should come after UNION not before}}
sl@0
   147
sl@0
   148
# Except operator
sl@0
   149
#
sl@0
   150
do_test select4-3.1.1 {
sl@0
   151
  execsql {
sl@0
   152
    SELECT DISTINCT log FROM t1
sl@0
   153
    EXCEPT
sl@0
   154
    SELECT n FROM t1 WHERE log=3
sl@0
   155
    ORDER BY log;
sl@0
   156
  }
sl@0
   157
} {0 1 2 3 4}
sl@0
   158
do_test select4-3.1.2 {
sl@0
   159
  execsql {
sl@0
   160
    CREATE TABLE t2 AS 
sl@0
   161
      SELECT DISTINCT log FROM t1
sl@0
   162
      EXCEPT
sl@0
   163
      SELECT n FROM t1 WHERE log=3
sl@0
   164
      ORDER BY log;
sl@0
   165
    SELECT * FROM t2;
sl@0
   166
  }
sl@0
   167
} {0 1 2 3 4}
sl@0
   168
execsql {DROP TABLE t2}
sl@0
   169
do_test select4-3.1.3 {
sl@0
   170
  execsql {
sl@0
   171
    CREATE TABLE t2 AS 
sl@0
   172
      SELECT DISTINCT log FROM t1
sl@0
   173
      EXCEPT
sl@0
   174
      SELECT n FROM t1 WHERE log=3
sl@0
   175
      ORDER BY log DESC;
sl@0
   176
    SELECT * FROM t2;
sl@0
   177
  }
sl@0
   178
} {4 3 2 1 0}
sl@0
   179
execsql {DROP TABLE t2}
sl@0
   180
ifcapable subquery {
sl@0
   181
  do_test select4-3.2 {
sl@0
   182
    execsql {
sl@0
   183
      SELECT log FROM t1 WHERE n IN 
sl@0
   184
        (SELECT DISTINCT log FROM t1 EXCEPT
sl@0
   185
         SELECT n FROM t1 WHERE log=3)
sl@0
   186
      ORDER BY log;
sl@0
   187
    }
sl@0
   188
  } {0 1 2 2}
sl@0
   189
}
sl@0
   190
do_test select4-3.3 {
sl@0
   191
  set v [catch {execsql {
sl@0
   192
    SELECT DISTINCT log FROM t1 ORDER BY log
sl@0
   193
    EXCEPT
sl@0
   194
    SELECT n FROM t1 WHERE log=3
sl@0
   195
    ORDER BY log;
sl@0
   196
  }} msg]
sl@0
   197
  lappend v $msg
sl@0
   198
} {1 {ORDER BY clause should come after EXCEPT not before}}
sl@0
   199
sl@0
   200
# Intersect operator
sl@0
   201
#
sl@0
   202
do_test select4-4.1.1 {
sl@0
   203
  execsql {
sl@0
   204
    SELECT DISTINCT log FROM t1
sl@0
   205
    INTERSECT
sl@0
   206
    SELECT n FROM t1 WHERE log=3
sl@0
   207
    ORDER BY log;
sl@0
   208
  }
sl@0
   209
} {5}
sl@0
   210
sl@0
   211
do_test select4-4.1.2 {
sl@0
   212
  execsql {
sl@0
   213
    SELECT DISTINCT log FROM t1
sl@0
   214
    UNION ALL
sl@0
   215
    SELECT 6
sl@0
   216
    INTERSECT
sl@0
   217
    SELECT n FROM t1 WHERE log=3
sl@0
   218
    ORDER BY t1.log;
sl@0
   219
  }
sl@0
   220
} {5 6}
sl@0
   221
sl@0
   222
do_test select4-4.1.3 {
sl@0
   223
  execsql {
sl@0
   224
    CREATE TABLE t2 AS
sl@0
   225
      SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
sl@0
   226
      INTERSECT
sl@0
   227
      SELECT n FROM t1 WHERE log=3
sl@0
   228
      ORDER BY log;
sl@0
   229
    SELECT * FROM t2;
sl@0
   230
  }
sl@0
   231
} {5 6}
sl@0
   232
execsql {DROP TABLE t2}
sl@0
   233
do_test select4-4.1.4 {
sl@0
   234
  execsql {
sl@0
   235
    CREATE TABLE t2 AS
sl@0
   236
      SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
sl@0
   237
      INTERSECT
sl@0
   238
      SELECT n FROM t1 WHERE log=3
sl@0
   239
      ORDER BY log DESC;
sl@0
   240
    SELECT * FROM t2;
sl@0
   241
  }
sl@0
   242
} {6 5}
sl@0
   243
execsql {DROP TABLE t2}
sl@0
   244
ifcapable subquery {
sl@0
   245
  do_test select4-4.2 {
sl@0
   246
    execsql {
sl@0
   247
      SELECT log FROM t1 WHERE n IN 
sl@0
   248
        (SELECT DISTINCT log FROM t1 INTERSECT
sl@0
   249
         SELECT n FROM t1 WHERE log=3)
sl@0
   250
      ORDER BY log;
sl@0
   251
    }
sl@0
   252
  } {3}
sl@0
   253
}
sl@0
   254
do_test select4-4.3 {
sl@0
   255
  set v [catch {execsql {
sl@0
   256
    SELECT DISTINCT log FROM t1 ORDER BY log
sl@0
   257
    INTERSECT
sl@0
   258
    SELECT n FROM t1 WHERE log=3
sl@0
   259
    ORDER BY log;
sl@0
   260
  }} msg]
sl@0
   261
  lappend v $msg
sl@0
   262
} {1 {ORDER BY clause should come after INTERSECT not before}}
sl@0
   263
sl@0
   264
# Various error messages while processing UNION or INTERSECT
sl@0
   265
#
sl@0
   266
do_test select4-5.1 {
sl@0
   267
  set v [catch {execsql {
sl@0
   268
    SELECT DISTINCT log FROM t2
sl@0
   269
    UNION ALL
sl@0
   270
    SELECT n FROM t1 WHERE log=3
sl@0
   271
    ORDER BY log;
sl@0
   272
  }} msg]
sl@0
   273
  lappend v $msg
sl@0
   274
} {1 {no such table: t2}}
sl@0
   275
do_test select4-5.2 {
sl@0
   276
  set v [catch {execsql {
sl@0
   277
    SELECT DISTINCT log AS "xyzzy" FROM t1
sl@0
   278
    UNION ALL
sl@0
   279
    SELECT n FROM t1 WHERE log=3
sl@0
   280
    ORDER BY xyzzy;
sl@0
   281
  }} msg]
sl@0
   282
  lappend v $msg
sl@0
   283
} {0 {0 1 2 3 4 5 5 6 7 8}}
sl@0
   284
do_test select4-5.2b {
sl@0
   285
  set v [catch {execsql {
sl@0
   286
    SELECT DISTINCT log AS xyzzy FROM t1
sl@0
   287
    UNION ALL
sl@0
   288
    SELECT n FROM t1 WHERE log=3
sl@0
   289
    ORDER BY "xyzzy";
sl@0
   290
  }} msg]
sl@0
   291
  lappend v $msg
sl@0
   292
} {0 {0 1 2 3 4 5 5 6 7 8}}
sl@0
   293
do_test select4-5.2c {
sl@0
   294
  set v [catch {execsql {
sl@0
   295
    SELECT DISTINCT log FROM t1
sl@0
   296
    UNION ALL
sl@0
   297
    SELECT n FROM t1 WHERE log=3
sl@0
   298
    ORDER BY "xyzzy";
sl@0
   299
  }} msg]
sl@0
   300
  lappend v $msg
sl@0
   301
} {1 {1st ORDER BY term does not match any column in the result set}}
sl@0
   302
do_test select4-5.2d {
sl@0
   303
  set v [catch {execsql {
sl@0
   304
    SELECT DISTINCT log FROM t1
sl@0
   305
    INTERSECT
sl@0
   306
    SELECT n FROM t1 WHERE log=3
sl@0
   307
    ORDER BY "xyzzy";
sl@0
   308
  }} msg]
sl@0
   309
  lappend v $msg
sl@0
   310
} {1 {1st ORDER BY term does not match any column in the result set}}
sl@0
   311
do_test select4-5.2e {
sl@0
   312
  set v [catch {execsql {
sl@0
   313
    SELECT DISTINCT log FROM t1
sl@0
   314
    UNION ALL
sl@0
   315
    SELECT n FROM t1 WHERE log=3
sl@0
   316
    ORDER BY n;
sl@0
   317
  }} msg]
sl@0
   318
  lappend v $msg
sl@0
   319
} {0 {0 1 2 3 4 5 5 6 7 8}}
sl@0
   320
do_test select4-5.2f {
sl@0
   321
  catchsql {
sl@0
   322
    SELECT DISTINCT log FROM t1
sl@0
   323
    UNION ALL
sl@0
   324
    SELECT n FROM t1 WHERE log=3
sl@0
   325
    ORDER BY log;
sl@0
   326
  }
sl@0
   327
} {0 {0 1 2 3 4 5 5 6 7 8}}
sl@0
   328
do_test select4-5.2g {
sl@0
   329
  catchsql {
sl@0
   330
    SELECT DISTINCT log FROM t1
sl@0
   331
    UNION ALL
sl@0
   332
    SELECT n FROM t1 WHERE log=3
sl@0
   333
    ORDER BY 1;
sl@0
   334
  }
sl@0
   335
} {0 {0 1 2 3 4 5 5 6 7 8}}
sl@0
   336
do_test select4-5.2h {
sl@0
   337
  catchsql {
sl@0
   338
    SELECT DISTINCT log FROM t1
sl@0
   339
    UNION ALL
sl@0
   340
    SELECT n FROM t1 WHERE log=3
sl@0
   341
    ORDER BY 2;
sl@0
   342
  }
sl@0
   343
} {1 {1st ORDER BY term out of range - should be between 1 and 1}}
sl@0
   344
do_test select4-5.2i {
sl@0
   345
  catchsql {
sl@0
   346
    SELECT DISTINCT 1, log FROM t1
sl@0
   347
    UNION ALL
sl@0
   348
    SELECT 2, n FROM t1 WHERE log=3
sl@0
   349
    ORDER BY 2, 1;
sl@0
   350
  }
sl@0
   351
} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
sl@0
   352
do_test select4-5.2j {
sl@0
   353
  catchsql {
sl@0
   354
    SELECT DISTINCT 1, log FROM t1
sl@0
   355
    UNION ALL
sl@0
   356
    SELECT 2, n FROM t1 WHERE log=3
sl@0
   357
    ORDER BY 1, 2 DESC;
sl@0
   358
  }
sl@0
   359
} {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}}
sl@0
   360
do_test select4-5.2k {
sl@0
   361
  catchsql {
sl@0
   362
    SELECT DISTINCT 1, log FROM t1
sl@0
   363
    UNION ALL
sl@0
   364
    SELECT 2, n FROM t1 WHERE log=3
sl@0
   365
    ORDER BY n, 1;
sl@0
   366
  }
sl@0
   367
} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
sl@0
   368
do_test select4-5.3 {
sl@0
   369
  set v [catch {execsql {
sl@0
   370
    SELECT DISTINCT log, n FROM t1
sl@0
   371
    UNION ALL
sl@0
   372
    SELECT n FROM t1 WHERE log=3
sl@0
   373
    ORDER BY log;
sl@0
   374
  }} msg]
sl@0
   375
  lappend v $msg
sl@0
   376
} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
sl@0
   377
do_test select4-5.4 {
sl@0
   378
  set v [catch {execsql {
sl@0
   379
    SELECT log FROM t1 WHERE n=2
sl@0
   380
    UNION ALL
sl@0
   381
    SELECT log FROM t1 WHERE n=3
sl@0
   382
    UNION ALL
sl@0
   383
    SELECT log FROM t1 WHERE n=4
sl@0
   384
    UNION ALL
sl@0
   385
    SELECT log FROM t1 WHERE n=5
sl@0
   386
    ORDER BY log;
sl@0
   387
  }} msg]
sl@0
   388
  lappend v $msg
sl@0
   389
} {0 {1 2 2 3}}
sl@0
   390
sl@0
   391
do_test select4-6.1 {
sl@0
   392
  execsql {
sl@0
   393
    SELECT log, count(*) as cnt FROM t1 GROUP BY log
sl@0
   394
    UNION
sl@0
   395
    SELECT log, n FROM t1 WHERE n=7
sl@0
   396
    ORDER BY cnt, log;
sl@0
   397
  }
sl@0
   398
} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
sl@0
   399
do_test select4-6.2 {
sl@0
   400
  execsql {
sl@0
   401
    SELECT log, count(*) FROM t1 GROUP BY log
sl@0
   402
    UNION
sl@0
   403
    SELECT log, n FROM t1 WHERE n=7
sl@0
   404
    ORDER BY count(*), log;
sl@0
   405
  }
sl@0
   406
} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
sl@0
   407
sl@0
   408
# NULLs are indistinct for the UNION operator.
sl@0
   409
# Make sure the UNION operator recognizes this
sl@0
   410
#
sl@0
   411
do_test select4-6.3 {
sl@0
   412
  execsql {
sl@0
   413
    SELECT NULL UNION SELECT NULL UNION
sl@0
   414
    SELECT 1 UNION SELECT 2 AS 'x'
sl@0
   415
    ORDER BY x;
sl@0
   416
  }
sl@0
   417
} {{} 1 2}
sl@0
   418
do_test select4-6.3.1 {
sl@0
   419
  execsql {
sl@0
   420
    SELECT NULL UNION ALL SELECT NULL UNION ALL
sl@0
   421
    SELECT 1 UNION ALL SELECT 2 AS 'x'
sl@0
   422
    ORDER BY x;
sl@0
   423
  }
sl@0
   424
} {{} {} 1 2}
sl@0
   425
sl@0
   426
# Make sure the DISTINCT keyword treats NULLs as indistinct.
sl@0
   427
#
sl@0
   428
ifcapable subquery {
sl@0
   429
  do_test select4-6.4 {
sl@0
   430
    execsql {
sl@0
   431
      SELECT * FROM (
sl@0
   432
         SELECT NULL, 1 UNION ALL SELECT NULL, 1
sl@0
   433
      );
sl@0
   434
    }
sl@0
   435
  } {{} 1 {} 1}
sl@0
   436
  do_test select4-6.5 {
sl@0
   437
    execsql {
sl@0
   438
      SELECT DISTINCT * FROM (
sl@0
   439
         SELECT NULL, 1 UNION ALL SELECT NULL, 1
sl@0
   440
      );
sl@0
   441
    }
sl@0
   442
  } {{} 1}
sl@0
   443
  do_test select4-6.6 {
sl@0
   444
    execsql {
sl@0
   445
      SELECT DISTINCT * FROM (
sl@0
   446
         SELECT 1,2  UNION ALL SELECT 1,2
sl@0
   447
      );
sl@0
   448
    }
sl@0
   449
  } {1 2}
sl@0
   450
}
sl@0
   451
sl@0
   452
# Test distinctness of NULL in other ways.
sl@0
   453
#
sl@0
   454
do_test select4-6.7 {
sl@0
   455
  execsql {
sl@0
   456
    SELECT NULL EXCEPT SELECT NULL
sl@0
   457
  }
sl@0
   458
} {}
sl@0
   459
sl@0
   460
sl@0
   461
# Make sure column names are correct when a compound select appears as
sl@0
   462
# an expression in the WHERE clause.
sl@0
   463
#
sl@0
   464
do_test select4-7.1 {
sl@0
   465
  execsql {
sl@0
   466
    CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log;
sl@0
   467
    SELECT * FROM t2 ORDER BY x;
sl@0
   468
  }
sl@0
   469
} {0 1 1 1 2 2 3 4 4 8 5 15}  
sl@0
   470
ifcapable subquery {
sl@0
   471
  do_test select4-7.2 {
sl@0
   472
    execsql2 {
sl@0
   473
      SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2)
sl@0
   474
      ORDER BY n
sl@0
   475
    }
sl@0
   476
  } {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3}
sl@0
   477
  do_test select4-7.3 {
sl@0
   478
    execsql2 {
sl@0
   479
      SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2)
sl@0
   480
      ORDER BY n LIMIT 2
sl@0
   481
    }
sl@0
   482
  } {n 6 log 3 n 7 log 3}
sl@0
   483
  do_test select4-7.4 {
sl@0
   484
    execsql2 {
sl@0
   485
      SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2)
sl@0
   486
      ORDER BY n LIMIT 2
sl@0
   487
    }
sl@0
   488
  } {n 1 log 0 n 2 log 1}
sl@0
   489
} ;# ifcapable subquery
sl@0
   490
sl@0
   491
} ;# ifcapable compound
sl@0
   492
sl@0
   493
# Make sure DISTINCT works appropriately on TEXT and NUMERIC columns.
sl@0
   494
do_test select4-8.1 {
sl@0
   495
  execsql {
sl@0
   496
    BEGIN;
sl@0
   497
    CREATE TABLE t3(a text, b float, c text);
sl@0
   498
    INSERT INTO t3 VALUES(1, 1.1, '1.1');
sl@0
   499
    INSERT INTO t3 VALUES(2, 1.10, '1.10');
sl@0
   500
    INSERT INTO t3 VALUES(3, 1.10, '1.1');
sl@0
   501
    INSERT INTO t3 VALUES(4, 1.1, '1.10');
sl@0
   502
    INSERT INTO t3 VALUES(5, 1.2, '1.2');
sl@0
   503
    INSERT INTO t3 VALUES(6, 1.3, '1.3');
sl@0
   504
    COMMIT;
sl@0
   505
  }
sl@0
   506
  execsql {
sl@0
   507
    SELECT DISTINCT b FROM t3 ORDER BY c;
sl@0
   508
  }
sl@0
   509
} {1.1 1.2 1.3}
sl@0
   510
do_test select4-8.2 {
sl@0
   511
  execsql {
sl@0
   512
    SELECT DISTINCT c FROM t3 ORDER BY c;
sl@0
   513
  }
sl@0
   514
} {1.1 1.10 1.2 1.3}
sl@0
   515
sl@0
   516
# Make sure the names of columns are taken from the right-most subquery
sl@0
   517
# right in a compound query.  Ticket #1721
sl@0
   518
#
sl@0
   519
ifcapable compound {
sl@0
   520
sl@0
   521
do_test select4-9.1 {
sl@0
   522
  execsql2 {
sl@0
   523
    SELECT x, y FROM t2 UNION SELECT a, b FROM t3 ORDER BY x LIMIT 1
sl@0
   524
  }
sl@0
   525
} {x 0 y 1}
sl@0
   526
do_test select4-9.2 {
sl@0
   527
  execsql2 {
sl@0
   528
    SELECT x, y FROM t2 UNION ALL SELECT a, b FROM t3 ORDER BY x LIMIT 1
sl@0
   529
  }
sl@0
   530
} {x 0 y 1}
sl@0
   531
do_test select4-9.3 {
sl@0
   532
  execsql2 {
sl@0
   533
    SELECT x, y FROM t2 EXCEPT SELECT a, b FROM t3 ORDER BY x LIMIT 1
sl@0
   534
  }
sl@0
   535
} {x 0 y 1}
sl@0
   536
do_test select4-9.4 {
sl@0
   537
  execsql2 {
sl@0
   538
    SELECT x, y FROM t2 INTERSECT SELECT 0 AS a, 1 AS b;
sl@0
   539
  }
sl@0
   540
} {x 0 y 1}
sl@0
   541
do_test select4-9.5 {
sl@0
   542
  execsql2 {
sl@0
   543
    SELECT 0 AS x, 1 AS y
sl@0
   544
    UNION
sl@0
   545
    SELECT 2 AS p, 3 AS q
sl@0
   546
    UNION
sl@0
   547
    SELECT 4 AS a, 5 AS b
sl@0
   548
    ORDER BY x LIMIT 1
sl@0
   549
  }
sl@0
   550
} {x 0 y 1}
sl@0
   551
sl@0
   552
ifcapable subquery {
sl@0
   553
do_test select4-9.6 {
sl@0
   554
  execsql2 {
sl@0
   555
    SELECT * FROM (
sl@0
   556
      SELECT 0 AS x, 1 AS y
sl@0
   557
      UNION
sl@0
   558
      SELECT 2 AS p, 3 AS q
sl@0
   559
      UNION
sl@0
   560
      SELECT 4 AS a, 5 AS b
sl@0
   561
    ) ORDER BY 1 LIMIT 1;
sl@0
   562
  }
sl@0
   563
} {x 0 y 1}
sl@0
   564
do_test select4-9.7 {
sl@0
   565
  execsql2 {
sl@0
   566
    SELECT * FROM (
sl@0
   567
      SELECT 0 AS x, 1 AS y
sl@0
   568
      UNION
sl@0
   569
      SELECT 2 AS p, 3 AS q
sl@0
   570
      UNION
sl@0
   571
      SELECT 4 AS a, 5 AS b
sl@0
   572
    ) ORDER BY x LIMIT 1;
sl@0
   573
  }
sl@0
   574
} {x 0 y 1}
sl@0
   575
} ;# ifcapable subquery
sl@0
   576
sl@0
   577
do_test select4-9.8 {
sl@0
   578
  execsql {
sl@0
   579
    SELECT 0 AS x, 1 AS y
sl@0
   580
    UNION
sl@0
   581
    SELECT 2 AS y, -3 AS x
sl@0
   582
    ORDER BY x LIMIT 1;
sl@0
   583
  }
sl@0
   584
} {0 1}
sl@0
   585
sl@0
   586
do_test select4-9.9.1 {
sl@0
   587
  execsql2 {
sl@0
   588
    SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a
sl@0
   589
  }
sl@0
   590
} {a 1 b 2 a 3 b 4}
sl@0
   591
sl@0
   592
ifcapable subquery {
sl@0
   593
do_test select4-9.9.2 {
sl@0
   594
  execsql2 {
sl@0
   595
    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
sl@0
   596
     WHERE b=3
sl@0
   597
  }
sl@0
   598
} {}
sl@0
   599
do_test select4-9.10 {
sl@0
   600
  execsql2 {
sl@0
   601
    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
sl@0
   602
     WHERE b=2
sl@0
   603
  }
sl@0
   604
} {a 1 b 2}
sl@0
   605
do_test select4-9.11 {
sl@0
   606
  execsql2 {
sl@0
   607
    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
sl@0
   608
     WHERE b=2
sl@0
   609
  }
sl@0
   610
} {a 1 b 2}
sl@0
   611
do_test select4-9.12 {
sl@0
   612
  execsql2 {
sl@0
   613
    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
sl@0
   614
     WHERE b>0
sl@0
   615
  }
sl@0
   616
} {a 1 b 2 a 3 b 4}
sl@0
   617
} ;# ifcapable subquery
sl@0
   618
sl@0
   619
# Try combining DISTINCT, LIMIT, and OFFSET.  Make sure they all work
sl@0
   620
# together.
sl@0
   621
#
sl@0
   622
do_test select4-10.1 {
sl@0
   623
  execsql {
sl@0
   624
    SELECT DISTINCT log FROM t1 ORDER BY log
sl@0
   625
  }
sl@0
   626
} {0 1 2 3 4 5}
sl@0
   627
do_test select4-10.2 {
sl@0
   628
  execsql {
sl@0
   629
    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 4
sl@0
   630
  }
sl@0
   631
} {0 1 2 3}
sl@0
   632
do_test select4-10.3 {
sl@0
   633
  execsql {
sl@0
   634
    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0
sl@0
   635
  }
sl@0
   636
} {}
sl@0
   637
do_test select4-10.4 {
sl@0
   638
  execsql {
sl@0
   639
    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1
sl@0
   640
  }
sl@0
   641
} {0 1 2 3 4 5}
sl@0
   642
do_test select4-10.5 {
sl@0
   643
  execsql {
sl@0
   644
    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 OFFSET 2
sl@0
   645
  }
sl@0
   646
} {2 3 4 5}
sl@0
   647
do_test select4-10.6 {
sl@0
   648
  execsql {
sl@0
   649
    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 3 OFFSET 2
sl@0
   650
  }
sl@0
   651
} {2 3 4}
sl@0
   652
do_test select4-10.7 {
sl@0
   653
  execsql {
sl@0
   654
    SELECT DISTINCT log FROM t1 ORDER BY +log LIMIT 3 OFFSET 20
sl@0
   655
  }
sl@0
   656
} {}
sl@0
   657
do_test select4-10.8 {
sl@0
   658
  execsql {
sl@0
   659
    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 OFFSET 3
sl@0
   660
  }
sl@0
   661
} {}
sl@0
   662
do_test select4-10.9 {
sl@0
   663
  execsql {
sl@0
   664
    SELECT DISTINCT max(n), log FROM t1 ORDER BY +log; -- LIMIT 2 OFFSET 1
sl@0
   665
  }
sl@0
   666
} {31 5}
sl@0
   667
sl@0
   668
# Make sure compound SELECTs with wildly different numbers of columns
sl@0
   669
# do not cause assertion faults due to register allocation issues.
sl@0
   670
#
sl@0
   671
do_test select4-11.1 {
sl@0
   672
  catchsql {
sl@0
   673
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   674
    UNION
sl@0
   675
    SELECT x FROM t2
sl@0
   676
  }
sl@0
   677
} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
sl@0
   678
do_test select4-11.2 {
sl@0
   679
  catchsql {
sl@0
   680
    SELECT x FROM t2
sl@0
   681
    UNION
sl@0
   682
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   683
  }
sl@0
   684
} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
sl@0
   685
do_test select4-11.3 {
sl@0
   686
  catchsql {
sl@0
   687
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   688
    UNION ALL
sl@0
   689
    SELECT x FROM t2
sl@0
   690
  }
sl@0
   691
} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
sl@0
   692
do_test select4-11.4 {
sl@0
   693
  catchsql {
sl@0
   694
    SELECT x FROM t2
sl@0
   695
    UNION ALL
sl@0
   696
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   697
  }
sl@0
   698
} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
sl@0
   699
do_test select4-11.5 {
sl@0
   700
  catchsql {
sl@0
   701
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   702
    EXCEPT
sl@0
   703
    SELECT x FROM t2
sl@0
   704
  }
sl@0
   705
} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
sl@0
   706
do_test select4-11.6 {
sl@0
   707
  catchsql {
sl@0
   708
    SELECT x FROM t2
sl@0
   709
    EXCEPT
sl@0
   710
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   711
  }
sl@0
   712
} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
sl@0
   713
do_test select4-11.7 {
sl@0
   714
  catchsql {
sl@0
   715
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   716
    INTERSECT
sl@0
   717
    SELECT x FROM t2
sl@0
   718
  }
sl@0
   719
} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
sl@0
   720
do_test select4-11.8 {
sl@0
   721
  catchsql {
sl@0
   722
    SELECT x FROM t2
sl@0
   723
    INTERSECT
sl@0
   724
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   725
  }
sl@0
   726
} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
sl@0
   727
sl@0
   728
do_test select4-11.11 {
sl@0
   729
  catchsql {
sl@0
   730
    SELECT x FROM t2
sl@0
   731
    UNION
sl@0
   732
    SELECT x FROM t2
sl@0
   733
    UNION ALL
sl@0
   734
    SELECT x FROM t2
sl@0
   735
    EXCEPT
sl@0
   736
    SELECT x FROM t2
sl@0
   737
    INTERSECT
sl@0
   738
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   739
  }
sl@0
   740
} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
sl@0
   741
do_test select4-11.12 {
sl@0
   742
  catchsql {
sl@0
   743
    SELECT x FROM t2
sl@0
   744
    UNION
sl@0
   745
    SELECT x FROM t2
sl@0
   746
    UNION ALL
sl@0
   747
    SELECT x FROM t2
sl@0
   748
    EXCEPT
sl@0
   749
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   750
    EXCEPT
sl@0
   751
    SELECT x FROM t2
sl@0
   752
  }
sl@0
   753
} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
sl@0
   754
do_test select4-11.13 {
sl@0
   755
  catchsql {
sl@0
   756
    SELECT x FROM t2
sl@0
   757
    UNION
sl@0
   758
    SELECT x FROM t2
sl@0
   759
    UNION ALL
sl@0
   760
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   761
    UNION ALL
sl@0
   762
    SELECT x FROM t2
sl@0
   763
    EXCEPT
sl@0
   764
    SELECT x FROM t2
sl@0
   765
  }
sl@0
   766
} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
sl@0
   767
do_test select4-11.14 {
sl@0
   768
  catchsql {
sl@0
   769
    SELECT x FROM t2
sl@0
   770
    UNION
sl@0
   771
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   772
    UNION
sl@0
   773
    SELECT x FROM t2
sl@0
   774
    UNION ALL
sl@0
   775
    SELECT x FROM t2
sl@0
   776
    EXCEPT
sl@0
   777
    SELECT x FROM t2
sl@0
   778
  }
sl@0
   779
} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
sl@0
   780
do_test select4-11.15 {
sl@0
   781
  catchsql {
sl@0
   782
    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
sl@0
   783
    UNION
sl@0
   784
    SELECT x FROM t2
sl@0
   785
    INTERSECT
sl@0
   786
    SELECT x FROM t2
sl@0
   787
    UNION ALL
sl@0
   788
    SELECT x FROM t2
sl@0
   789
    EXCEPT
sl@0
   790
    SELECT x FROM t2
sl@0
   791
  }
sl@0
   792
} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
sl@0
   793
sl@0
   794
} ;# ifcapable compound
sl@0
   795
sl@0
   796
finish_test