select_index.slt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. # Copyright 2015 - 2019 The Cockroach Authors. All rights reserved.
  2. # Copyright Materialize, Inc. and contributors. All rights reserved.
  3. #
  4. # Use of this software is governed by the Business Source License
  5. # included in the LICENSE file at the root of this repository.
  6. #
  7. # As of the Change Date specified in that file, in accordance with
  8. # the Business Source License, use of this software will be governed
  9. # by the Apache License, Version 2.0.
  10. #
  11. # This file is derived from the logic test suite in CockroachDB. The
  12. # original file was retrieved on June 10, 2019 from:
  13. #
  14. # https://github.com/cockroachdb/cockroach/blob/d2f7fbf5dd1fc1a099bbad790a2e1f7c60a66cc3/pkg/sql/logictest/testdata/logic_test/select_index
  15. #
  16. # The original source code is subject to the terms of the Apache
  17. # 2.0 license, a copy of which can be found in the LICENSE file at the
  18. # root of this repository.
  19. mode cockroach
  20. simple conn=mz_system,user=mz_system
  21. ALTER SYSTEM SET unsafe_enable_table_keys = true
  22. ----
  23. COMPLETE 0
  24. statement ok
  25. CREATE TABLE t (
  26. a INT PRIMARY KEY,
  27. b INT,
  28. c INT
  29. )
  30. statement ok
  31. INSERT INTO t VALUES (1, 2, 3), (3, 4, 5), (5, 6, 7)
  32. query I rowsort
  33. SELECT a FROM t WHERE a < 4.0
  34. ----
  35. 1
  36. 3
  37. query I
  38. SELECT b FROM t WHERE c > 4.0 AND a < 4
  39. ----
  40. 4
  41. statement ok
  42. CREATE TABLE ab (
  43. s STRING,
  44. i INT
  45. )
  46. statement ok
  47. INSERT INTO ab VALUES ('a', 1), ('b', 1), ('c', 1)
  48. query IT rowsort
  49. SELECT i, s FROM ab WHERE (i, s) < (1, 'c')
  50. ----
  51. 1 a
  52. 1 b
  53. statement ok
  54. CREATE INDEX baz ON ab (i, s)
  55. query IT rowsort
  56. SELECT i, s FROM ab@baz WHERE (i, s) < (1, 'c')
  57. ----
  58. 1 a
  59. 1 b
  60. # Issue materialize#14426: verify we don't have an internal filter that contains "a IN ()"
  61. # (which causes an error in DistSQL due to expression serialization).
  62. statement ok
  63. CREATE TABLE tab0(
  64. k INT PRIMARY KEY,
  65. a INT,
  66. b INT
  67. )
  68. query I
  69. SELECT k FROM tab0 WHERE (a IN (6) AND a > 6) OR b >= 4
  70. ----
  71. # Regression tests for materialize#12022
  72. statement ok
  73. CREATE TABLE t12022 (
  74. c1 INT,
  75. c2 BOOL,
  76. );
  77. statement ok
  78. INSERT INTO t12022 VALUES
  79. (1, NULL), (1, false), (1, true),
  80. (2, NULL), (2, false), (2, true);
  81. query IB
  82. SELECT * FROM t12022@i WHERE (c1, c2) > (1, NULL) ORDER BY (c1, c2);
  83. ----
  84. 2 NULL
  85. 2 false
  86. 2 true
  87. query IB
  88. SELECT * FROM t12022@i WHERE (c1, c2) > (1, false) ORDER BY (c1, c2);
  89. ----
  90. 1 true
  91. 2 NULL
  92. 2 false
  93. 2 true
  94. query IB
  95. SELECT * FROM t12022@i WHERE (c1, c2) > (1, true) ORDER BY (c1, c2);
  96. ----
  97. 2 NULL
  98. 2 false
  99. 2 true
  100. query IB
  101. SELECT * FROM t12022@i WHERE (c1, c2) < (2, NULL) ORDER BY (c1, c2);
  102. ----
  103. 1 NULL
  104. 1 false
  105. 1 true
  106. query IB
  107. SELECT * FROM t12022@i WHERE (c1, c2) < (2, false) ORDER BY (c1, c2);
  108. ----
  109. 1 NULL
  110. 1 false
  111. 1 true
  112. query IB
  113. SELECT * FROM t12022@i WHERE (c1, c2) < (2, true) ORDER BY (c1, c2);
  114. ----
  115. 1 NULL
  116. 1 false
  117. 1 true
  118. 2 false
  119. # Regression test for materialize#20035.
  120. statement ok
  121. CREATE TABLE favorites (
  122. id INT NOT NULL DEFAULT unique_rowid(),
  123. resource_type STRING(30) NOT NULL,
  124. resource_key STRING(255) NOT NULL,
  125. device_group STRING(30) NOT NULL,
  126. customerid INT NOT NULL,
  127. jurisdiction STRING(2) NOT NULL,
  128. brand STRING(255) NOT NULL,
  129. created_ts TIMESTAMP NULL,
  130. guid_id STRING(100) NOT NULL,
  131. locale STRING(10) NOT NULL DEFAULT NULL,
  132. )
  133. statement ok
  134. INSERT INTO favorites (customerid, guid_id, resource_type, device_group, jurisdiction, brand, locale, resource_key)
  135. VALUES (1, '1', 'GAME', 'web', 'MT', 'xxx', 'en_GB', 'tp'),
  136. (2, '2', 'GAME', 'web', 'MT', 'xxx', 'en_GB', 'ts'),
  137. (3, '3', 'GAME', 'web', 'MT', 'xxx', 'en_GB', 'ts1'),
  138. (4, '4', 'GAME', 'web', 'MT', 'xxx', 'en_GB', 'ts2'),
  139. (5, '5', 'GAME', 'web', 'MT', 'xxx', 'en_GB', 'ts3'),
  140. (6, '6', 'GAME', 'web', 'MT', 'xxx', 'en_GB', 'ts4')
  141. query TI rowsort
  142. SELECT
  143. resource_key,
  144. count(resource_key) total
  145. FROM favorites f1
  146. WHERE f1.jurisdiction = 'MT'
  147. AND f1.brand = 'xxx'
  148. AND f1.resource_type = 'GAME'
  149. AND f1.device_group = 'web'
  150. AND f1.locale = 'en_GB'
  151. AND f1.resource_key IN ('ts', 'ts2', 'ts3')
  152. GROUP BY resource_key
  153. ORDER BY total DESC
  154. ----
  155. ts 1
  156. ts2 1
  157. ts3 1
  158. statement ok
  159. CREATE TABLE abcd (
  160. a INT,
  161. b INT,
  162. c INT,
  163. d INT,
  164. )
  165. # Regression tests for materialize#20362 (IS NULL handling).
  166. statement ok
  167. INSERT INTO abcd VALUES
  168. (NULL, NULL, NULL),
  169. (NULL, NULL, 1),
  170. (NULL, NULL, 5),
  171. (NULL, NULL, 10),
  172. (NULL, 1, NULL),
  173. (NULL, 1, 1),
  174. (NULL, 1, 5),
  175. (NULL, 1, 10),
  176. (NULL, 5, NULL),
  177. (NULL, 5, 1),
  178. (NULL, 5, 5),
  179. (NULL, 5, 10),
  180. (NULL, 10, NULL),
  181. (NULL, 10, 1),
  182. (NULL, 10, 5),
  183. (NULL, 10, 10),
  184. (1, NULL, NULL),
  185. (1, NULL, 1),
  186. (1, NULL, 5),
  187. (1, NULL, 10),
  188. (1, 1, NULL),
  189. (1, 1, 1),
  190. (1, 1, 5),
  191. (1, 1, 10),
  192. (1, 5, NULL),
  193. (1, 5, 1),
  194. (1, 5, 5),
  195. (1, 5, 10),
  196. (1, 10, NULL),
  197. (1, 10, 1),
  198. (1, 10, 5),
  199. (1, 10, 10)
  200. query IIII rowsort
  201. SELECT * FROM abcd@abcd WHERE a IS NULL AND b > 5
  202. ----
  203. NULL 10 NULL NULL
  204. NULL 10 1 NULL
  205. NULL 10 5 NULL
  206. NULL 10 10 NULL
  207. query IIII rowsort
  208. SELECT * FROM abcd@abcd WHERE a IS NULL AND b < 5
  209. ----
  210. NULL 1 NULL NULL
  211. NULL 1 1 NULL
  212. NULL 1 5 NULL
  213. NULL 1 10 NULL
  214. query IIII partialsort(1,2)
  215. SELECT * FROM abcd@abcd WHERE a IS NULL ORDER BY b
  216. ----
  217. NULL NULL NULL NULL
  218. NULL NULL 1 NULL
  219. NULL NULL 5 NULL
  220. NULL NULL 10 NULL
  221. NULL 1 NULL NULL
  222. NULL 1 1 NULL
  223. NULL 1 5 NULL
  224. NULL 1 10 NULL
  225. NULL 5 NULL NULL
  226. NULL 5 1 NULL
  227. NULL 5 5 NULL
  228. NULL 5 10 NULL
  229. NULL 10 NULL NULL
  230. NULL 10 1 NULL
  231. NULL 10 5 NULL
  232. NULL 10 10 NULL
  233. query IIII
  234. SELECT * FROM abcd@abcd WHERE a = 1 AND b IS NULL AND c > 0 AND c < 10 ORDER BY c
  235. ----
  236. 1 NULL 1 NULL
  237. 1 NULL 5 NULL
  238. # Regression test for materialize#21831.
  239. statement ok
  240. CREATE TABLE str (k INT PRIMARY KEY, v STRING)
  241. statement ok
  242. INSERT INTO str VALUES (1, 'A'), (4, 'AB'), (2, 'ABC'), (5, 'ABCD'), (3, 'ABCDEZ'), (9, 'ABD')
  243. query IT rowsort
  244. SELECT k, v FROM str WHERE v LIKE 'ABC%'
  245. ----
  246. 2 ABC
  247. 5 ABCD
  248. 3 ABCDEZ
  249. query IT rowsort
  250. SELECT k, v FROM str WHERE v LIKE 'ABC%Z'
  251. ----
  252. 3 ABCDEZ
  253. query IT rowsort
  254. SELECT k, v FROM str WHERE v SIMILAR TO 'ABC_*'
  255. ----
  256. 2 ABC
  257. 5 ABCD
  258. 3 ABCDEZ
  259. # Regression tests for materialize#22670.
  260. statement ok
  261. CREATE TABLE xy (x INT, y INT)
  262. statement ok
  263. CREATE INDEX xy_idx ON xy (x, y)
  264. statement ok
  265. INSERT INTO xy VALUES (NULL, NULL), (1, NULL), (NULL, 1), (1, 1)
  266. query II rowsort
  267. SELECT * FROM xy WHERE x IN (NULL, 1, 2)
  268. ----
  269. 1 NULL
  270. 1 1
  271. statement ok
  272. CREATE TABLE ef (e INT, f INT)
  273. statement ok
  274. INSERT INTO ef VALUES (NULL, 1), (1, 1)
  275. query I rowsort
  276. SELECT e FROM ef WHERE f > 0 AND f < 2 ORDER BY f
  277. ----
  278. NULL
  279. 1
  280. query II
  281. SELECT * FROM xy WHERE (x, y) IN ((NULL, NULL), (1, NULL), (NULL, 1), (1, 1), (1, 2))
  282. ----
  283. 1 1
  284. # Test index constraints for IS (NOT) TRUE/FALSE.
  285. statement ok
  286. CREATE TABLE bool1 (
  287. a BOOL,
  288. );
  289. INSERT INTO bool1 VALUES (NULL), (TRUE), (FALSE)
  290. query B
  291. SELECT * FROM bool1 WHERE a IS NULL
  292. ----
  293. NULL
  294. query B rowsort
  295. SELECT * FROM bool1 WHERE a IS NOT NULL
  296. ----
  297. false
  298. true
  299. query B
  300. SELECT * FROM bool1 WHERE a IS TRUE
  301. ----
  302. true
  303. query B rowsort
  304. SELECT * FROM bool1 WHERE a IS NOT TRUE
  305. ----
  306. NULL
  307. false
  308. query B
  309. SELECT * FROM bool1 WHERE a IS FALSE
  310. ----
  311. false
  312. query B rowsort
  313. SELECT * FROM bool1 WHERE a IS NOT FALSE
  314. ----
  315. NULL
  316. true
  317. statement ok
  318. CREATE TABLE bool2 (
  319. a BOOL NOT NULL,
  320. );
  321. INSERT INTO bool2 VALUES (TRUE), (FALSE)
  322. query B
  323. SELECT * FROM bool2 WHERE a IS NULL
  324. ----
  325. query B rowsort
  326. SELECT * FROM bool2 WHERE a IS NOT NULL
  327. ----
  328. false
  329. true
  330. query B
  331. SELECT * FROM bool2 WHERE a IS TRUE
  332. ----
  333. true
  334. query B
  335. SELECT * FROM bool2 WHERE a IS NOT TRUE
  336. ----
  337. false
  338. query B
  339. SELECT * FROM bool2 WHERE a IS FALSE
  340. ----
  341. false
  342. query B
  343. SELECT * FROM bool2 WHERE a IS NOT FALSE
  344. ----
  345. true
  346. # Test index constraints for IS (NOT) DISTINCT FROM on an integer column.
  347. statement ok
  348. CREATE TABLE int (
  349. a INT,
  350. );
  351. INSERT INTO int VALUES (NULL), (0), (1), (2)
  352. query I
  353. SELECT * FROM int WHERE a IS NOT DISTINCT FROM 2
  354. ----
  355. 2
  356. query I rowsort
  357. SELECT * FROM int WHERE a IS DISTINCT FROM 2
  358. ----
  359. NULL
  360. 0
  361. 1
  362. # ------------------------------------------------------------------------------
  363. # Non-covering index
  364. # ------------------------------------------------------------------------------
  365. statement ok
  366. CREATE TABLE noncover (
  367. a INT PRIMARY KEY,
  368. b INT,
  369. c INT,
  370. d INT,
  371. )
  372. statement ok
  373. INSERT INTO noncover VALUES (1, 2, 3, 4), (5, 6, 7, 8)
  374. query IIII
  375. SELECT * FROM noncover WHERE b = 2
  376. ----
  377. 1 2 3 4
  378. query IIII
  379. SET tracing=on, kv; SELECT * FROM noncover WHERE b = 2; SET tracing=off
  380. ----
  381. 1 2 3 4
  382. # Verify that the index join span created doesn't include any potential child
  383. # interleaved tables. We look only for spans with the primary prefix to avoid
  384. # inconsistency between the fakedist and local test configurations.
  385. query T rowsort
  386. SELECT message FROM [SHOW KV TRACE FOR SESSION]
  387. WHERE message LIKE 'Scan /Table/65/1%'
  388. ----
  389. Scan /Table/65/1/1{-/#}
  390. # Subset of output columns, not including tested column.
  391. query II
  392. SELECT a, d FROM noncover WHERE b=2
  393. ----
  394. 1 4
  395. # Subset of output columns, not including tested column or order by column.
  396. query I
  397. SELECT a FROM noncover WHERE b=2 ORDER BY c DESC
  398. ----
  399. 1
  400. # Regression: panic when projecting non-covered column in sorted index join.
  401. query III
  402. SELECT a, b, d FROM noncover WHERE b=2 ORDER BY b
  403. ----
  404. 1 2 4
  405. # Use non-covered column in filtered and sorted index join.
  406. query II
  407. SELECT a, b FROM noncover WHERE b=2 AND d>3 ORDER BY b
  408. ----
  409. 1 2
  410. query IIII
  411. SELECT * FROM noncover WHERE c = 7
  412. ----
  413. 5 6 7 8
  414. query IIII
  415. SELECT * FROM noncover WHERE c > 0 ORDER BY c DESC
  416. ----
  417. 5 6 7 8
  418. 1 2 3 4
  419. query IIII
  420. SELECT * FROM noncover WHERE c > 0 AND d = 8
  421. ----
  422. 5 6 7 8
  423. # Contradiction
  424. query IIII
  425. SELECT * FROM noncover WHERE b = 5 AND b <> 5
  426. ----
  427. # Contradiction with remainder filter
  428. query IIII
  429. SELECT * FROM noncover WHERE b = 5 AND b <> 5 AND d>100
  430. ----
  431. # ------------------------------------------------------------------------------
  432. # These tests verify that while we are joining an index with the table, we
  433. # evaluate what parts of the filter we can using the columns in the index
  434. # to avoid unnecessary lookups in the table.
  435. # ------------------------------------------------------------------------------
  436. statement ok
  437. CREATE TABLE t2 (
  438. a INT PRIMARY KEY,
  439. b INT,
  440. c INT,
  441. s STRING,
  442. INDEX bc (b, c),
  443. FAMILY (a),
  444. FAMILY (b),
  445. FAMILY (c),
  446. FAMILY (s)
  447. )
  448. statement ok
  449. INSERT INTO t2 VALUES
  450. (1, 1, 1, '11'),
  451. (2, 1, 2, '12'),
  452. (3, 1, 3, '13'),
  453. (4, 2, 1, '21'),
  454. (5, 2, 2, '22'),
  455. (6, 2, 3, '23'),
  456. (7, 3, 1, '31'),
  457. (8, 3, 2, '32'),
  458. (9, 3, 3, '33')
  459. query I rowsort
  460. SELECT a FROM t2 WHERE b = 2 OR ((b BETWEEN 2 AND 1) AND ((s != 'a') OR (s = 'a')))
  461. ----
  462. 4
  463. 5
  464. 6
  465. statement ok
  466. CREATE TABLE t3 (k INT PRIMARY KEY, v INT, w INT, INDEX v(v))
  467. statement ok
  468. INSERT INTO t3 VALUES
  469. (10, 50, 1),
  470. (30, 40, 2),
  471. (50, 30, 3),
  472. (70, 20, 4),
  473. (90, 10, 5),
  474. (110, 0, 6),
  475. (130, -10, 7)
  476. query I
  477. SELECT w FROM t3 WHERE v > 0 AND v < 100 ORDER BY v
  478. ----
  479. 5
  480. 4
  481. 3
  482. 2
  483. 1
  484. statement ok
  485. CREATE TABLE tab1 (
  486. pk INTEGER NOT NULL,
  487. col0 INTEGER NULL,
  488. col1 FLOAT NULL,
  489. col2 STRING NULL,
  490. col3 INTEGER NULL,
  491. col4 FLOAT NULL,
  492. col5 STRING NULL,
  493. CONSTRAINT "primary" PRIMARY KEY (pk ASC),
  494. INDEX idx_tab1_0 (col0 ASC),
  495. INDEX idx_tab1_1 (col1 ASC),
  496. INDEX idx_tab1_3 (col3 ASC),
  497. INDEX idx_tab1_4 (col4 ASC),
  498. FAMILY "primary" (pk, col0, col1, col2, col3, col4, col5)
  499. )
  500. statement ok
  501. INSERT INTO tab1(pk, col0, col3) VALUES
  502. (1, 65, 65),
  503. (2, 87, 87),
  504. (3, 70, 70),
  505. (4, 88, 88),
  506. (5, 69, 69),
  507. (6, 72, 72),
  508. (7, 82, 82)
  509. query II
  510. SELECT pk, col0 FROM tab1 WHERE (col3 BETWEEN 66 AND 87) ORDER BY 1 DESC
  511. ----
  512. 7 82
  513. 6 72
  514. 5 69
  515. 3 70
  516. 2 87
  517. # Use a unique index with a nullable column. Rows with a NULL value for that
  518. # column will have the PK columns added to the key, whereas rows with a non-NULL
  519. # value will not. Ensure that when the index is used, it returns all rows.
  520. statement ok
  521. CREATE TABLE abc (a INT, b INT, c INT, PRIMARY KEY(a, b), UNIQUE INDEX c (c))
  522. statement ok
  523. INSERT INTO abc (a, b, c) VALUES (0, 1, NULL);
  524. INSERT INTO abc (a, b, c) VALUES (0, 2, NULL);
  525. INSERT INTO abc (a, b, c) VALUES (1, 1, NULL);
  526. INSERT INTO abc (a, b, c) VALUES (1, 2, NULL);
  527. INSERT INTO abc (a, b, c) VALUES (2, 1, 1);
  528. INSERT INTO abc (a, b, c) VALUES (2, 2, 2);
  529. query III rowsort
  530. SELECT * FROM abc WHERE (c IS NULL OR c=2) AND a>0
  531. ----
  532. 1 1 NULL
  533. 1 2 NULL
  534. 2 2 2