subquery.slt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  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/subquery
  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. # Tests for subqueries (SELECT statements which are part of a bigger statement).
  25. query I
  26. SELECT (SELECT 1)
  27. ----
  28. 1
  29. query B
  30. SELECT 1 IN (SELECT 1)
  31. ----
  32. true
  33. query B
  34. SELECT 1 IN ((((SELECT 1))))
  35. ----
  36. true
  37. query I
  38. SELECT ARRAY(((((VALUES (1), (2))))))[2]
  39. ----
  40. 2
  41. query I
  42. SELECT 1 + (SELECT 1)
  43. ----
  44. 2
  45. query error db error: ERROR: Expected subselect to return 1 column, got 2 columns
  46. SELECT 1 + (SELECT 1 AS a, 2 AS b)
  47. query B
  48. SELECT (1, 2, 3) IN (SELECT 1, 2, 3)
  49. ----
  50. true
  51. # TODO(ggevay): scalar subquery returning multiple columns. We could add support for this.
  52. # (same for many of the following commented out queries)
  53. # query B
  54. # SELECT (1, 2, 3) = (SELECT 1, 2, 3)
  55. # ----
  56. # true
  57. #
  58. # query B
  59. # SELECT (1, 2, 3) != (SELECT 1, 2, 3)
  60. # ----
  61. # false
  62. #
  63. # query B
  64. # SELECT (SELECT 1, 2, 3) = (SELECT 1, 2, 3)
  65. # ----
  66. # true
  67. query B
  68. SELECT (SELECT 1) IN (SELECT 1)
  69. ----
  70. true
  71. query B
  72. SELECT (SELECT 1) IN (1)
  73. ----
  74. true
  75. # NB: Cockroach has different behavior from Postgres on a few esoteric
  76. # subqueries. The Cockroach behavior seems more sensical and
  77. # supporting the specific Postgres behavior appears onerous. Fingers
  78. # crossed this doesn't bite us down the road.
  79. # TODO(ggevay): Materialize error msg is unclear to me.
  80. # # Postgres cannot handle this query (but MySQL can), even though it
  81. # # seems sensical:
  82. # # ERROR: subquery must return only one column
  83. # # LINE 1: select (select 1, 2) IN (select 1, 2);
  84. # # ^
  85. # query B
  86. # SELECT (SELECT 1, 2) IN (SELECT 1, 2)
  87. # ----
  88. # true
  89. #
  90. # # Postgres cannot handle this query, even though it seems sensical:
  91. # # ERROR: subquery must return only one column
  92. # # LINE 1: select (select 1, 2) IN ((1, 2));
  93. # # ^
  94. # query B
  95. # SELECT (SELECT 1, 2) IN ((1, 2))
  96. # ----
  97. # true
  98. #
  99. # # Postgres cannot handle this query, even though it seems sensical:
  100. # # ERROR: subquery has too many columns
  101. # # LINE 1: select (select (1, 2)) IN (select 1, 2);
  102. # # ^
  103. # query B
  104. # SELECT (SELECT (1, 2)) IN (SELECT 1, 2)
  105. # ----
  106. # true
  107. query B
  108. SELECT (SELECT (1, 2)) IN ((1, 2))
  109. ----
  110. true
  111. # # Postgres cannot handle this query, even though it seems sensical:
  112. # # ERROR: subquery must return only one column
  113. # # LINE 1: select (select 1, 2) in (select (1, 2));
  114. # # ^
  115. # query B
  116. # SELECT (SELECT 1, 2) IN (SELECT (1, 2))
  117. # ----
  118. # true
  119. query B
  120. SELECT (SELECT (1, 2)) IN (SELECT (1, 2))
  121. ----
  122. true
  123. query B
  124. SELECT 1 = ANY(SELECT 1)
  125. ----
  126. true
  127. query B
  128. SELECT (1, 2) = ANY(SELECT 1, 2)
  129. ----
  130. true
  131. query B
  132. SELECT 1 = SOME(SELECT 1)
  133. ----
  134. true
  135. query B
  136. SELECT (1, 2) = SOME(SELECT 1, 2)
  137. ----
  138. true
  139. query B
  140. SELECT 1 = ALL(SELECT 1)
  141. ----
  142. true
  143. query B
  144. SELECT (1, 2) = ALL(SELECT 1, 2)
  145. ----
  146. true
  147. query error pgcode 42601 db error: ERROR: Expected subselect to return 1 column, got 2 columns
  148. SELECT (SELECT 1, 2)
  149. query error db error: ERROR: subquery1 has 2 columns available but 1 columns specified
  150. SELECT 1 IN (SELECT 1 AS a, 2 AS b)
  151. query error db error: ERROR: subquery2 has 1 columns available but 2 columns specified
  152. SELECT (1, 2) IN (SELECT 1 AS a)
  153. statement ok
  154. CREATE TABLE abc (a INT PRIMARY KEY, b INT, c INT)
  155. statement ok
  156. INSERT INTO abc VALUES (1, 2, 3), (4, 5, 6)
  157. # statement ok
  158. # ALTER TABLE abc SPLIT AT VALUES ((SELECT 1))
  159. query error db error: ERROR: subquery2 has 3 columns available but 2 columns specified
  160. SELECT (1, 2) IN (SELECT * FROM abc)
  161. query B
  162. SELECT (1, 2) IN (SELECT a, b FROM abc)
  163. ----
  164. true
  165. query B
  166. SELECT (1, 2) IN (SELECT a, b FROM abc WHERE false)
  167. ----
  168. false
  169. query error db error: ERROR: Expected subselect to return 1 column, got 3 columns
  170. SELECT (SELECT * FROM abc)
  171. query error db error: ERROR: Evaluation error: more than one record produced in subquery
  172. SELECT (SELECT a FROM abc)
  173. query I
  174. SELECT (SELECT a FROM abc WHERE false)
  175. ----
  176. NULL
  177. query II
  178. VALUES (1, (SELECT (2)))
  179. ----
  180. 1 2
  181. statement ok
  182. INSERT INTO abc VALUES ((SELECT 7), (SELECT 8), (SELECT 9))
  183. query III
  184. SELECT * FROM abc WHERE a = 7
  185. ----
  186. 7 8 9
  187. statement error db error: ERROR: column "a" is of type integer but expression is of type record\(f1: integer,f2: integer,f3: integer\)
  188. INSERT INTO abc VALUES ((SELECT (10, 11, 12)))
  189. statement error db error: ERROR: Expected subselect to return 1 column, got 3 columns
  190. INSERT INTO abc VALUES ((SELECT 10, 11, 12))
  191. statement ok
  192. CREATE TABLE xyz (x INT PRIMARY KEY, y INT, z INT)
  193. statement ok
  194. INSERT INTO xyz SELECT * FROM abc
  195. query III rowsort
  196. SELECT * FROM xyz
  197. ----
  198. 1 2 3
  199. 4 5 6
  200. 7 8 9
  201. statement ok
  202. INSERT INTO xyz (x, y, z) VALUES (10, 11, 12)
  203. # Materialize doesn't allow subqueries in `SET`.
  204. # statement ok
  205. # UPDATE xyz SET z = (SELECT 10) WHERE x = 7
  206. statement ok
  207. UPDATE xyz SET z = 10 WHERE x = 7
  208. query III rowsort
  209. SELECT * FROM xyz
  210. ----
  211. 1 2 3
  212. 4 5 6
  213. 7 8 10
  214. 10 11 12
  215. # statement error value type tuple{int, int} doesn't match type int of column "z"
  216. # UPDATE xyz SET z = (SELECT (10, 11)) WHERE x = 7
  217. #
  218. # statement error [subquery must return 2 columns, found 1 | number of columns (2) does not match number of values (1)]
  219. # UPDATE xyz SET (y, z) = (SELECT (11, 12)) WHERE x = 7
  220. #regression, see database-issues#2135
  221. #statement ok
  222. #UPDATE xyz SET (y, z) = (SELECT 11, 12) WHERE x = 7
  223. #
  224. #query III rowsort
  225. #SELECT * FROM xyz
  226. #----
  227. #1 2 3
  228. #4 5 6
  229. #7 11 12
  230. #10 11 12
  231. query B
  232. SELECT 1 IN (SELECT x FROM xyz ORDER BY x DESC)
  233. ----
  234. true
  235. query III
  236. SELECT * FROM xyz WHERE x = (SELECT min(x) FROM xyz)
  237. ----
  238. 1 2 3
  239. query III
  240. SELECT * FROM xyz WHERE x = (SELECT max(x) FROM xyz)
  241. ----
  242. 10 11 12
  243. query III
  244. SELECT * FROM xyz WHERE x = (SELECT max(x) FROM xyz WHERE EXISTS(SELECT * FROM xyz WHERE z=x+3))
  245. ----
  246. 10 11 12
  247. statement ok
  248. CREATE TABLE kv (k INT PRIMARY KEY, v STRING)
  249. statement ok
  250. INSERT INTO kv VALUES (1, 'one')
  251. query IT
  252. SELECT * FROM kv WHERE k = (SELECT k FROM kv WHERE (k, v) = (1, 'one'))
  253. ----
  254. 1 one
  255. query B
  256. SELECT EXISTS(SELECT 1 FROM kv AS x WHERE x.k = 1)
  257. ----
  258. true
  259. query B
  260. SELECT EXISTS(SELECT 1 FROM kv WHERE k = 2)
  261. ----
  262. false
  263. # Tests for subquery in the FROM part of a SELECT
  264. query II colnames,rowsort
  265. SELECT * FROM (VALUES (1, 2)) AS foo
  266. ----
  267. column1 column2
  268. 1 2
  269. query II colnames,rowsort
  270. SELECT * FROM (VALUES (1, 2))
  271. ----
  272. column1 column2
  273. 1 2
  274. query IT colnames,rowsort
  275. SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three')) AS foo
  276. ----
  277. column1 column2
  278. 1 one
  279. 2 two
  280. 3 three
  281. query III colnames,rowsort
  282. SELECT * FROM (VALUES (1, 2, 3), (4, 5, 6)) AS foo
  283. ----
  284. column1 column2 column3
  285. 1 2 3
  286. 4 5 6
  287. query III colnames,rowsort
  288. SELECT * FROM (VALUES (1, 2, 3), (4, 5, 6)) AS foo (foo1, foo2, foo3)
  289. ----
  290. foo1 foo2 foo3
  291. 1 2 3
  292. 4 5 6
  293. query III colnames,rowsort
  294. SELECT * FROM (VALUES (1, 2, 3), (4, 5, 6)) AS foo (foo1, foo2)
  295. ----
  296. foo1 foo2 column3
  297. 1 2 3
  298. 4 5 6
  299. query III colnames,rowsort
  300. SELECT * FROM (SELECT * FROM xyz) AS foo WHERE x < 7
  301. ----
  302. x y z
  303. 1 2 3
  304. 4 5 6
  305. query III colnames,rowsort
  306. SELECT * FROM (SELECT * FROM xyz) AS foo (foo1) WHERE foo1 < 7
  307. ----
  308. foo1 y z
  309. 1 2 3
  310. 4 5 6
  311. query III colnames,rowsort
  312. SELECT * FROM (SELECT * FROM xyz AS moo (moo1, moo2, moo3)) as foo (foo1) WHERE foo1 < 7
  313. ----
  314. foo1 moo2 moo3
  315. 1 2 3
  316. 4 5 6
  317. query III colnames,rowsort
  318. SELECT * FROM (SELECT * FROM xyz AS moo (moo1, moo2, moo3) ORDER BY moo1) as foo (foo1) WHERE foo1 < 7
  319. ----
  320. foo1 moo2 moo3
  321. 1 2 3
  322. 4 5 6
  323. query III colnames
  324. SELECT * FROM (SELECT * FROM xyz AS moo (moo1, moo2, moo3) ORDER BY moo1) as foo (foo1) WHERE foo1 < 7 ORDER BY moo2 DESC
  325. ----
  326. foo1 moo2 moo3
  327. 4 5 6
  328. 1 2 3
  329. query III colnames
  330. SELECT * FROM (SELECT * FROM (VALUES (1, 2, 3), (4, 5, 6)) AS moo (moo1, moo2, moo3) WHERE moo1 = 4) as foo (foo1)
  331. ----
  332. foo1 moo2 moo3
  333. 4 5 6
  334. query III colnames
  335. SELECT * FROM (SELECT * FROM (VALUES (1, 8, 8), (3, 1, 1), (2, 4, 4)) AS moo (moo1, moo2, moo3) ORDER BY moo2) as foo (foo1) ORDER BY foo1
  336. ----
  337. foo1 moo2 moo3
  338. 1 8 8
  339. 2 4 4
  340. 3 1 1
  341. query II colnames
  342. SELECT a, b FROM (VALUES (1, 2, 3), (3, 4, 7), (5, 6, 10)) AS foo (a, b, c) WHERE a + b = c
  343. ----
  344. a b
  345. 1 2
  346. 3 4
  347. query I colnames
  348. SELECT foo.a FROM (VALUES (1), (2), (3)) AS foo (a)
  349. ----
  350. a
  351. 1
  352. 2
  353. 3
  354. query IITT colnames
  355. SELECT foo.a, a, column2, foo.column2 FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three')) AS foo (a)
  356. ----
  357. a a column2 column2
  358. 1 1 one one
  359. 2 2 two two
  360. 3 3 three three
  361. query I
  362. SELECT x FROM xyz WHERE x IN (SELECT x FROM xyz WHERE x = 7)
  363. ----
  364. 7
  365. # TODO(ggevay): Materialize doesn't allow subqueries in _top-level_ LIMIT or OFFSET clauses.
  366. # query I
  367. # SELECT x FROM xyz WHERE x = 7 LIMIT (SELECT x FROM xyz WHERE x = 1)
  368. # ----
  369. # 7
  370. #
  371. # query I
  372. # SELECT x FROM xyz ORDER BY x OFFSET (SELECT x FROM xyz WHERE x = 1)
  373. # ----
  374. # 4
  375. # 7
  376. # 10
  377. # TODO(ggevay): Materialize doesn't allow subqueries in RETURNING clause.
  378. # query B
  379. # INSERT INTO xyz (x, y, z) VALUES (13, 11, 12) RETURNING (y IN (SELECT y FROM xyz))
  380. # ----
  381. # true
  382. # This test checks that the double sub-query plan expansion caused by a
  383. # sub-expression being shared by two or more plan nodes does not
  384. # panic.
  385. statement ok
  386. CREATE TABLE tab4(col0 INTEGER, col1 FLOAT, col3 INTEGER, col4 FLOAT)
  387. statement ok
  388. INSERT INTO tab4 VALUES (1,1,1,1)
  389. statement ok
  390. CREATE INDEX idx_tab4_0 ON tab4 (col4,col0)
  391. query I
  392. SELECT col0 FROM tab4 WHERE (col0 <= 0 AND col4 <= 5.38) OR (col4 IN (SELECT col1 FROM tab4 WHERE col1 > 8.27)) AND (col3 <= 5 AND (col3 BETWEEN 7 AND 9))
  393. ----
  394. statement ok
  395. CREATE TABLE z (z INT PRIMARY KEY)
  396. query I
  397. SELECT * FROM z WHERE CAST(COALESCE((SELECT 'a'), (SELECT 'a')) AS bytea) < 'a'
  398. ----
  399. statement ok
  400. CREATE TABLE test (a INT PRIMARY KEY)
  401. statement ok
  402. CREATE TABLE test2(b INT PRIMARY KEY)
  403. # Regression test for materialize#24225.
  404. query I
  405. SELECT * FROM test2 WHERE 0 = CASE WHEN true THEN (SELECT a FROM test LIMIT 1) ELSE 10 END
  406. ----
  407. # Regression test for database-issues#8301.
  408. query I
  409. SELECT (SELECT ARRAY(SELECT 1))[1]
  410. ----
  411. 1
  412. query B
  413. SELECT (SELECT 123 IN (VALUES (1), (2)))
  414. ----
  415. false
  416. statement error db error: ERROR: unknown schema 'crdb_internal'
  417. SELECT * FROM xyz WHERE x IN (SELECT crdb_internal.force_error('', 'subqueryfail'))
  418. statement ok
  419. PREPARE a AS SELECT 1 = (SELECT $1::int)
  420. query B
  421. EXECUTE a(1)
  422. ----
  423. true
  424. query B
  425. EXECUTE a(2)
  426. ----
  427. false
  428. statement ok
  429. PREPARE b AS SELECT EXISTS (SELECT $1::int)
  430. query B
  431. EXECUTE b(3)
  432. ----
  433. true
  434. # Regression test for materialize#29205 - make sure the memory account for wrapped local
  435. # planNode within subqueries is properly hooked up.
  436. statement ok
  437. CREATE TABLE a (a TEXT PRIMARY KEY)
  438. # Materialize doesn't support this non-standard [...] syntax.
  439. # statement ok
  440. # SELECT (SELECT repeat(a::STRING, 2) FROM [INSERT INTO a VALUES('foo') RETURNING a]);
  441. # statement ok
  442. # UPDATE abc SET a = 2, (b, c) = (SELECT 5, 6) WHERE a = 1;
  443. statement ok
  444. UPDATE abc SET a = 2, b = 5, c = 6 WHERE a = 1;
  445. # # Failure in outer query with mutations in the subquery do not take effect.
  446. # statement error pq: bar
  447. # SELECT crdb_internal.force_error('foo', 'bar') FROM [INSERT INTO abc VALUES (11,12,13) RETURNING a]
  448. query III
  449. SELECT * FROM abc WHERE a = 11
  450. ----
  451. # statement error pq: bar
  452. # INSERT INTO abc VALUES (1,2, (SELECT crdb_internal.force_error('foo', 'bar')))