join.slt 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148
  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/join
  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. # The join condition logic is tricky to get right with NULL
  25. # values. Simple implementations can deal well with NULLs on the first
  26. # or last row but fail to handle them in the middle. So the test table
  27. # must contain at least 3 rows with a null in the middle. This test
  28. # table also contains the pair 44/42 so that a test with a non-trivial
  29. # ON condition can be written.
  30. statement ok
  31. CREATE TABLE onecolumn (x INT)
  32. statement ok
  33. INSERT INTO onecolumn(x) VALUES (44), (NULL), (42)
  34. query II colnames,rowsort
  35. SELECT * FROM onecolumn AS a(x) CROSS JOIN onecolumn AS b(y)
  36. ----
  37. x y
  38. 44 44
  39. 44 NULL
  40. 44 42
  41. NULL 44
  42. NULL NULL
  43. NULL 42
  44. 42 44
  45. 42 NULL
  46. 42 42
  47. # Check that name resolution chokes on ambiguity when it needs to.
  48. query error db error: ERROR: column reference "x" is ambiguous
  49. SELECT x FROM onecolumn AS a, onecolumn AS b
  50. query II colnames,rowsort
  51. SELECT * FROM onecolumn AS a(x) JOIN onecolumn AS b(y) ON a.x = b.y
  52. ----
  53. x y
  54. 44 44
  55. 42 42
  56. query I colnames
  57. SELECT * FROM onecolumn AS a JOIN onecolumn as b USING (x) ORDER BY x
  58. ----
  59. x
  60. 42
  61. 44
  62. query I colnames,rowsort
  63. SELECT * FROM onecolumn AS a NATURAL JOIN onecolumn as b
  64. ----
  65. x
  66. 44
  67. 42
  68. query II colnames,rowsort
  69. SELECT * FROM onecolumn AS a(x) LEFT OUTER JOIN onecolumn AS b(y) ON a.x = b.y
  70. ----
  71. x y
  72. 44 44
  73. NULL NULL
  74. 42 42
  75. query I colnames
  76. SELECT * FROM onecolumn AS a LEFT OUTER JOIN onecolumn AS b USING (x) ORDER BY x
  77. ----
  78. x
  79. 42
  80. 44
  81. NULL
  82. # Check that ORDER BY chokes on ambiguity if no table less columns
  83. # were introduced by USING. (materialize#12239)
  84. query error db error: ERROR: column reference "x" is ambiguous
  85. SELECT * FROM onecolumn AS a, onecolumn AS b ORDER BY x
  86. query I colnames,rowsort
  87. SELECT * FROM onecolumn AS a NATURAL LEFT OUTER JOIN onecolumn AS b
  88. ----
  89. x
  90. 44
  91. NULL
  92. 42
  93. query II colnames,rowsort
  94. SELECT * FROM onecolumn AS a(x) RIGHT OUTER JOIN onecolumn AS b(y) ON a.x = b.y
  95. ----
  96. x y
  97. 44 44
  98. 42 42
  99. NULL NULL
  100. query I colnames
  101. SELECT * FROM onecolumn AS a RIGHT OUTER JOIN onecolumn AS b USING (x) ORDER BY x
  102. ----
  103. x
  104. 42
  105. 44
  106. NULL
  107. query I colnames,rowsort
  108. SELECT * FROM onecolumn AS a NATURAL RIGHT OUTER JOIN onecolumn AS b
  109. ----
  110. x
  111. 44
  112. 42
  113. NULL
  114. statement ok
  115. CREATE TABLE onecolumn_w(w INT)
  116. statement ok
  117. INSERT INTO onecolumn_w(w) VALUES (42),(43)
  118. query II colnames,rowsort
  119. SELECT * FROM onecolumn AS a NATURAL JOIN onecolumn_w as b
  120. ----
  121. x w
  122. 44 42
  123. 44 43
  124. NULL 42
  125. NULL 43
  126. 42 42
  127. 42 43
  128. statement ok
  129. CREATE TABLE othercolumn (x INT)
  130. statement ok
  131. INSERT INTO othercolumn(x) VALUES (43),(42),(16)
  132. query II colnames
  133. SELECT * FROM onecolumn AS a FULL OUTER JOIN othercolumn AS b ON a.x = b.x ORDER BY a.x,b.x
  134. ----
  135. x x
  136. 42 42
  137. 44 NULL
  138. NULL 16
  139. NULL 43
  140. NULL NULL
  141. query I colnames
  142. SELECT * FROM onecolumn AS a FULL OUTER JOIN othercolumn AS b USING (x) ORDER BY x
  143. ----
  144. x
  145. 16
  146. 42
  147. 43
  148. 44
  149. NULL
  150. # Check that the source columns can be selected separately from the
  151. # USING column (materialize#12033).
  152. query III colnames
  153. SELECT x AS s, a.x, b.x FROM onecolumn AS a FULL OUTER JOIN othercolumn AS b USING (x) ORDER BY s
  154. ----
  155. s x x
  156. 16 NULL 16
  157. 42 42 42
  158. 43 NULL 43
  159. 44 44 NULL
  160. NULL NULL NULL
  161. query I colnames
  162. SELECT * FROM onecolumn AS a NATURAL FULL OUTER JOIN othercolumn AS b ORDER BY x
  163. ----
  164. x
  165. 16
  166. 42
  167. 43
  168. 44
  169. NULL
  170. # Check that a limit on the JOIN's result do not cause rows from the
  171. # JOIN operands to become invisible to the JOIN.
  172. query I colnames
  173. SELECT * FROM (SELECT x FROM onecolumn ORDER BY x DESC) NATURAL JOIN (VALUES (42)) AS v(x) LIMIT 1
  174. ----
  175. x
  176. 42
  177. statement ok
  178. CREATE TABLE empty (x INT)
  179. query II
  180. SELECT * FROM onecolumn AS a(x) CROSS JOIN empty AS b(y)
  181. ----
  182. query II
  183. SELECT * FROM empty AS a CROSS JOIN onecolumn AS b
  184. ----
  185. query II
  186. SELECT * FROM onecolumn AS a(x) JOIN empty AS b(y) ON a.x = b.y
  187. ----
  188. query I
  189. SELECT * FROM onecolumn AS a JOIN empty AS b USING (x)
  190. ----
  191. query II
  192. SELECT * FROM empty AS a(x) JOIN onecolumn AS b(y) ON a.x = b.y
  193. ----
  194. query I
  195. SELECT * FROM empty AS a JOIN onecolumn AS b USING (x)
  196. ----
  197. query II colnames
  198. SELECT * FROM onecolumn AS a(x) LEFT OUTER JOIN empty AS b(y) ON a.x = b.y ORDER BY a.x
  199. ----
  200. x y
  201. 42 NULL
  202. 44 NULL
  203. NULL NULL
  204. query I colnames
  205. SELECT * FROM onecolumn AS a LEFT OUTER JOIN empty AS b USING (x) ORDER BY x
  206. ----
  207. x
  208. 42
  209. 44
  210. NULL
  211. query II
  212. SELECT * FROM empty AS a(x) LEFT OUTER JOIN onecolumn AS b(y) ON a.x = b.y
  213. ----
  214. query I
  215. SELECT * FROM empty AS a LEFT OUTER JOIN onecolumn AS b USING (x)
  216. ----
  217. query II
  218. SELECT * FROM onecolumn AS a(x) RIGHT OUTER JOIN empty AS b(y) ON a.x = b.y
  219. ----
  220. query I
  221. SELECT * FROM onecolumn AS a RIGHT OUTER JOIN empty AS b USING (x)
  222. ----
  223. query II colnames
  224. SELECT * FROM empty AS a(x) FULL OUTER JOIN onecolumn AS b(y) ON a.x = b.y ORDER BY b.y
  225. ----
  226. x y
  227. NULL 42
  228. NULL 44
  229. NULL NULL
  230. query I colnames
  231. SELECT * FROM empty AS a FULL OUTER JOIN onecolumn AS b USING (x) ORDER BY x
  232. ----
  233. x
  234. 42
  235. 44
  236. NULL
  237. query II colnames
  238. SELECT * FROM onecolumn AS a(x) FULL OUTER JOIN empty AS b(y) ON a.x = b.y ORDER BY a.x
  239. ----
  240. x y
  241. 42 NULL
  242. 44 NULL
  243. NULL NULL
  244. query I colnames
  245. SELECT * FROM onecolumn AS a FULL OUTER JOIN empty AS b USING (x) ORDER BY x
  246. ----
  247. x
  248. 42
  249. 44
  250. NULL
  251. query II colnames
  252. SELECT * FROM empty AS a(x) FULL OUTER JOIN onecolumn AS b(y) ON a.x = b.y ORDER BY b.y
  253. ----
  254. x y
  255. NULL 42
  256. NULL 44
  257. NULL NULL
  258. query I colnames
  259. SELECT * FROM empty AS a FULL OUTER JOIN onecolumn AS b USING (x) ORDER BY x
  260. ----
  261. x
  262. 42
  263. 44
  264. NULL
  265. statement ok
  266. CREATE TABLE twocolumn (x INT, y INT)
  267. statement ok
  268. INSERT INTO twocolumn(x, y) VALUES (44,51), (NULL,52), (42,53), (45,45)
  269. # Natural joins with partial match
  270. query II colnames,rowsort
  271. SELECT * FROM onecolumn NATURAL JOIN twocolumn
  272. ----
  273. x y
  274. 44 51
  275. 42 53
  276. query IIII rowsort
  277. SELECT * FROM twocolumn AS a JOIN twocolumn AS b ON a.x = a.y
  278. ----
  279. 45 45 44 51
  280. 45 45 NULL 52
  281. 45 45 42 53
  282. 45 45 45 45
  283. # Inner join with filter predicate
  284. query II
  285. SELECT o.x, t.y FROM onecolumn o INNER JOIN twocolumn t ON (o.x=t.x AND t.y=53)
  286. ----
  287. 42 53
  288. # Outer joins with filter predicate
  289. query II rowsort
  290. SELECT o.x, t.y FROM onecolumn o LEFT OUTER JOIN twocolumn t ON (o.x=t.x AND t.y=53)
  291. ----
  292. 44 NULL
  293. NULL NULL
  294. 42 53
  295. query II rowsort
  296. SELECT o.x, t.y FROM onecolumn o LEFT OUTER JOIN twocolumn t ON (o.x=t.x AND o.x=44)
  297. ----
  298. 44 51
  299. NULL NULL
  300. 42 NULL
  301. query II rowsort
  302. SELECT o.x, t.y FROM onecolumn o LEFT OUTER JOIN twocolumn t ON (o.x=t.x AND t.x=44)
  303. ----
  304. 44 51
  305. NULL NULL
  306. 42 NULL
  307. # Computed columns with NATURAL FULL JOIN.
  308. query III rowsort
  309. SELECT * FROM (SELECT x, 2 two FROM onecolumn) NATURAL FULL JOIN (SELECT x, y+1 plus1 FROM twocolumn)
  310. ----
  311. NULL NULL 53
  312. NULL 2 NULL
  313. 45 NULL 46
  314. 44 2 52
  315. 42 2 54
  316. ## Simple test cases for inner, left, right, and outer joins
  317. statement ok
  318. CREATE TABLE a (i int)
  319. statement ok
  320. INSERT INTO a VALUES (1), (2), (3)
  321. statement ok
  322. CREATE TABLE b (i int, b bool)
  323. statement ok
  324. INSERT INTO b VALUES (2, true), (3, true), (4, false)
  325. query IIB rowsort
  326. SELECT * FROM a INNER JOIN b ON a.i = b.i
  327. ----
  328. 2 2 true
  329. 3 3 true
  330. query IIB rowsort
  331. SELECT * FROM a LEFT OUTER JOIN b ON a.i = b.i
  332. ----
  333. 1 NULL NULL
  334. 2 2 true
  335. 3 3 true
  336. query IIB rowsort
  337. SELECT * FROM a RIGHT OUTER JOIN b ON a.i = b.i
  338. ----
  339. 2 2 true
  340. 3 3 true
  341. NULL 4 false
  342. query IIB rowsort
  343. SELECT * FROM a FULL OUTER JOIN b ON a.i = b.i
  344. ----
  345. 1 NULL NULL
  346. 2 2 true
  347. 3 3 true
  348. NULL 4 false
  349. # Full outer join with filter predicate
  350. query IIB
  351. SELECT * FROM a FULL OUTER JOIN b ON (a.i = b.i and a.i>2) ORDER BY a.i, b.i
  352. ----
  353. 1 NULL NULL
  354. 2 NULL NULL
  355. 3 3 true
  356. NULL 2 true
  357. NULL 4 false
  358. # Duplicate right matches for a single left row
  359. statement ok
  360. INSERT INTO b VALUES (3, false)
  361. query IIB
  362. SELECT * FROM a RIGHT OUTER JOIN b ON a.i=b.i ORDER BY b.i, b.b
  363. ----
  364. 2 2 true
  365. 3 3 false
  366. 3 3 true
  367. NULL 4 false
  368. query IIB
  369. SELECT * FROM a FULL OUTER JOIN b ON a.i=b.i ORDER BY b.i, b.b
  370. ----
  371. 2 2 true
  372. 3 3 false
  373. 3 3 true
  374. NULL 4 false
  375. 1 NULL NULL
  376. # Check column orders and names.
  377. query IIIIII colnames
  378. SELECT * FROM (onecolumn CROSS JOIN twocolumn JOIN onecolumn AS a(b) ON a.b=twocolumn.x JOIN twocolumn AS c(d,e) ON a.b=c.d AND c.d=onecolumn.x) ORDER BY 1 LIMIT 1
  379. ----
  380. x x y b d e
  381. 42 42 53 42 42 53
  382. # Check sub-queries in ON conditions.
  383. query III colnames
  384. SELECT * FROM onecolumn JOIN twocolumn ON twocolumn.x = onecolumn.x AND onecolumn.x IN (SELECT x FROM twocolumn WHERE y >= 52)
  385. ----
  386. x x y
  387. 42 42 53
  388. # Check sub-queries as data sources.
  389. query I colnames
  390. SELECT * FROM onecolumn JOIN (VALUES (41),(42),(43)) AS a(x) USING (x)
  391. ----
  392. x
  393. 42
  394. query I colnames
  395. SELECT * FROM onecolumn JOIN (SELECT x + 2 AS x FROM onecolumn) USING (x)
  396. ----
  397. x
  398. 44
  399. # Check that a single column can have multiple table aliases.
  400. query IIII colnames
  401. SELECT * FROM (twocolumn AS a JOIN twocolumn AS b USING (x) JOIN twocolumn AS c USING (x)) ORDER BY x LIMIT 1
  402. ----
  403. x y y y
  404. 42 53 53 53
  405. query IIIIII colnames
  406. SELECT a.x AS s, b.x, c.x, a.y, b.y, c.y FROM (twocolumn AS a JOIN twocolumn AS b USING (x) JOIN twocolumn AS c USING (x)) ORDER BY s
  407. ----
  408. s x x y y y
  409. 42 42 42 53 53 53
  410. 44 44 44 51 51 51
  411. 45 45 45 45 45 45
  412. query error pgcode 42703 db error: ERROR: column "y" specified in USING clause does not exist in left table
  413. SELECT * FROM (onecolumn AS a JOIN onecolumn AS b USING (y))
  414. query error pgcode 42701 db error: ERROR: column name "x" appears more than once in USING clause not yet supported
  415. SELECT * FROM (onecolumn AS a JOIN onecolumn AS b USING (x, x))
  416. statement ok
  417. CREATE TABLE othertype (x TEXT)
  418. query error pgcode 42804 db error: ERROR: NATURAL/USING join column "x" types integer and text cannot be matched
  419. SELECT * FROM (onecolumn AS a JOIN othertype AS b USING (x))
  420. query error pgcode 42712 db error: ERROR: table name "onecolumn" specified more than once
  421. SELECT * FROM (onecolumn JOIN onecolumn USING (x))
  422. query error pgcode 42712 db error: ERROR: table name "onecolumn" specified more than once
  423. SELECT * FROM (onecolumn JOIN twocolumn USING (x) JOIN onecolumn USING (x))
  424. # Check that star expansion works across anonymous sources.
  425. query II rowsort
  426. SELECT * FROM (SELECT * FROM onecolumn), (SELECT * FROM onecolumn)
  427. ----
  428. 42 42
  429. 42 44
  430. 42 NULL
  431. 44 42
  432. 44 44
  433. 44 NULL
  434. NULL 42
  435. NULL 44
  436. NULL NULL
  437. # Check that anonymous sources are properly looked up without ambiguity.
  438. query I
  439. SELECT x FROM (onecolumn JOIN othercolumn USING (x)) JOIN (onecolumn AS a JOIN othercolumn AS b USING (x)) USING (x)
  440. ----
  441. 42
  442. # Check that multiple anonymous sources cause proper ambiguity errors.
  443. query error db error: ERROR: column reference "x" is ambiguous
  444. SELECT x FROM (SELECT * FROM onecolumn), (SELECT * FROM onecolumn)
  445. query error db error: ERROR: column reference "x" is ambiguous
  446. SELECT * FROM (onecolumn AS a JOIN onecolumn AS b ON x > 32)
  447. query error column "a.y" does not exist
  448. SELECT * FROM (onecolumn AS a JOIN onecolumn AS b ON a.y > y)
  449. statement ok
  450. CREATE TABLE s(x INT)
  451. statement ok
  452. INSERT INTO s(x) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
  453. # Ensure that large cross-joins are optimized somehow (materialize#10633)
  454. statement ok
  455. CREATE TABLE customers(id INT PRIMARY KEY NOT NULL)
  456. # statement ok
  457. # CREATE TABLE orders(id INT, cust INT REFERENCES customers(id))
  458. statement ok
  459. CREATE TABLE orders(id INT, cust INT)
  460. # TODO(benesch): fix parse error in this query.
  461. #
  462. # query TTTTTTTTIIITTI
  463. # SELECT NULL::text AS pktable_cat,
  464. # pkn.nspname AS pktable_schem,
  465. # pkc.relname AS pktable_name,
  466. # pka.attname AS pkcolumn_name,
  467. # NULL::text AS fktable_cat,
  468. # fkn.nspname AS fktable_schem,
  469. # fkc.relname AS fktable_name,
  470. # fka.attname AS fkcolumn_name,
  471. # pos.n AS key_seq,
  472. # CASE con.confupdtype
  473. # WHEN 'c' THEN 0
  474. # WHEN 'n' THEN 2
  475. # WHEN 'd' THEN 4
  476. # WHEN 'r' THEN 1
  477. # WHEN 'a' THEN 3
  478. # ELSE NULL
  479. # END AS update_rule,
  480. # CASE con.confdeltype
  481. # WHEN 'c' THEN 0
  482. # WHEN 'n' THEN 2
  483. # WHEN 'd' THEN 4
  484. # WHEN 'r' THEN 1
  485. # WHEN 'a' THEN 3
  486. # ELSE NULL
  487. # END AS delete_rule,
  488. # con.conname AS fk_name,
  489. # pkic.relname AS pk_name,
  490. # CASE
  491. # WHEN con.condeferrable
  492. # AND con.condeferred THEN 5
  493. # WHEN con.condeferrable THEN 6
  494. # ELSE 7
  495. # END AS deferrability
  496. # FROM pg_catalog.pg_namespace pkn,
  497. # pg_catalog.pg_class pkc,
  498. # pg_catalog.pg_attribute pka,
  499. # pg_catalog.pg_namespace fkn,
  500. # pg_catalog.pg_class fkc,
  501. # pg_catalog.pg_attribute fka,
  502. # pg_catalog.pg_constraint con,
  503. # pg_catalog.generate_series(1, 32) pos(n),
  504. # pg_catalog.pg_depend dep,
  505. # pg_catalog.pg_class pkic
  506. # WHERE pkn.oid = pkc.relnamespace
  507. # AND pkc.oid = pka.attrelid
  508. # AND pka.attnum = con.confkey[pos.n]
  509. # AND con.confrelid = pkc.oid
  510. # AND fkn.oid = fkc.relnamespace
  511. # AND fkc.oid = fka.attrelid
  512. # AND fka.attnum = con.conkey[pos.n]
  513. # AND con.conrelid = fkc.oid
  514. # AND con.contype = 'f'
  515. # AND con.oid = dep.objid
  516. # AND pkic.oid = dep.refobjid
  517. # AND pkic.relkind = 'i'
  518. # AND dep.classid = 'pg_constraint'::regclass::oid
  519. # AND dep.refclassid = 'pg_class'::regclass::oid
  520. # AND fkn.nspname = 'public'
  521. # AND fkc.relname = 'orders'
  522. # ORDER BY pkn.nspname,
  523. # pkc.relname,
  524. # con.conname,
  525. # pos.n
  526. # ----
  527. # NULL public customers id NULL public orders cust 1 3 3 fk_cust_ref_customers primary 7
  528. #
  529. # Tests for filter propagation through joins.
  530. statement ok
  531. CREATE TABLE square (n INT PRIMARY KEY, sq INT)
  532. statement ok
  533. INSERT INTO square VALUES (1,1), (2,4), (3,9), (4,16), (5,25), (6,36)
  534. statement ok
  535. CREATE TABLE pairs (a INT, b INT)
  536. statement ok
  537. INSERT INTO pairs VALUES (1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (2,3), (2,4), (2,5), (2,6), (3,4), (3,5), (3,6), (4,5), (4,6)
  538. query IIII rowsort
  539. SELECT * FROM pairs, square WHERE pairs.b = square.n
  540. ----
  541. 1 1 1 1
  542. 1 2 2 4
  543. 1 3 3 9
  544. 1 4 4 16
  545. 1 5 5 25
  546. 1 6 6 36
  547. 2 3 3 9
  548. 2 4 4 16
  549. 2 5 5 25
  550. 2 6 6 36
  551. 3 4 4 16
  552. 3 5 5 25
  553. 3 6 6 36
  554. 4 5 5 25
  555. 4 6 6 36
  556. query IIII rowsort
  557. SELECT * FROM pairs, square WHERE pairs.a + pairs.b = square.sq
  558. ----
  559. 1 3 2 4
  560. 3 6 3 9
  561. 4 5 3 9
  562. # Materialize and Postgres treat this division as integer division, while Cockroach and MySQL do floating point division.
  563. query IIII rowsort
  564. SELECT a, b, n, sq FROM (SELECT a, b, a * b / 2 AS div, n, sq FROM pairs, square) WHERE div = sq
  565. ----
  566. 1 2 1 1
  567. 1 3 1 1
  568. 2 4 2 4
  569. 3 6 3 9
  570. # Force a floating point division.
  571. query IIII rowsort
  572. SELECT a, b, n, sq FROM (SELECT a, b, a::float * b / 2 AS div, n, sq FROM pairs, square) WHERE div = sq
  573. ----
  574. 1 2 1 1
  575. 2 4 2 4
  576. 3 6 3 9
  577. query IIII rowsort
  578. SELECT * FROM pairs FULL OUTER JOIN square ON pairs.a + pairs.b = square.sq
  579. ----
  580. 1 1 NULL NULL
  581. 1 2 NULL NULL
  582. 1 3 2 4
  583. 1 4 NULL NULL
  584. 1 5 NULL NULL
  585. 1 6 NULL NULL
  586. 2 3 NULL NULL
  587. 2 4 NULL NULL
  588. 2 5 NULL NULL
  589. 2 6 NULL NULL
  590. 3 4 NULL NULL
  591. 3 5 NULL NULL
  592. 3 6 3 9
  593. 4 5 3 9
  594. 4 6 NULL NULL
  595. NULL NULL 1 1
  596. NULL NULL 4 16
  597. NULL NULL 5 25
  598. NULL NULL 6 36
  599. query IIII rowsort
  600. SELECT * FROM pairs FULL OUTER JOIN square ON pairs.a + pairs.b = square.sq WHERE pairs.b%2 <> square.sq%2
  601. ----
  602. 1 3 2 4
  603. 3 6 3 9
  604. # Filter propagation through outer joins.
  605. query IIII rowsort
  606. SELECT *
  607. FROM (SELECT * FROM pairs LEFT JOIN square ON b = sq AND a > 1 AND n < 6)
  608. WHERE b > 1 AND (n IS NULL OR n > 1) AND (n IS NULL OR a < sq)
  609. ----
  610. 1 2 NULL NULL
  611. 1 3 NULL NULL
  612. 1 4 NULL NULL
  613. 1 5 NULL NULL
  614. 1 6 NULL NULL
  615. 2 3 NULL NULL
  616. 2 4 2 4
  617. 2 5 NULL NULL
  618. 2 6 NULL NULL
  619. 3 4 2 4
  620. 3 5 NULL NULL
  621. 3 6 NULL NULL
  622. 4 5 NULL NULL
  623. 4 6 NULL NULL
  624. query IIII rowsort
  625. SELECT *
  626. FROM (SELECT * FROM pairs RIGHT JOIN square ON b = sq AND a > 1 AND n < 6)
  627. WHERE (a IS NULL OR a > 2) AND n > 1 AND (a IS NULL OR a < sq)
  628. ----
  629. 3 4 2 4
  630. NULL NULL 3 9
  631. NULL NULL 4 16
  632. NULL NULL 5 25
  633. NULL NULL 6 36
  634. statement ok
  635. CREATE TABLE t1 (col1 INT, x INT, col2 INT, y INT)
  636. statement ok
  637. CREATE TABLE t2 (col3 INT, y INT, x INT, col4 INT)
  638. statement ok
  639. INSERT INTO t1 VALUES (10, 1, 11, 1), (20, 2, 21, 1), (30, 3, 31, 1)
  640. statement ok
  641. INSERT INTO t2 VALUES (100, 1, 1, 101), (200, 1, 201, 2), (400, 1, 401, 4)
  642. query IIIIIII
  643. SELECT * FROM t1 JOIN t2 USING (x)
  644. ----
  645. 1 10 11 1 100 1 101
  646. query IIIIII
  647. SELECT * FROM t1 NATURAL JOIN t2
  648. ----
  649. 1 1 10 11 100 101
  650. query IIIIIIII
  651. SELECT * FROM t1 JOIN t2 ON t2.x=t1.x
  652. ----
  653. 10 1 11 1 100 1 1 101
  654. query IIIIIII rowsort
  655. SELECT * FROM t1 FULL OUTER JOIN t2 USING (x)
  656. ----
  657. 1 10 11 1 100 1 101
  658. 2 20 21 1 NULL NULL NULL
  659. 3 30 31 1 NULL NULL NULL
  660. 201 NULL NULL NULL 200 1 2
  661. 401 NULL NULL NULL 400 1 4
  662. query IIIIII rowsort
  663. SELECT * FROM t1 NATURAL FULL OUTER JOIN t2
  664. ----
  665. 1 1 10 11 100 101
  666. 2 1 20 21 NULL NULL
  667. 3 1 30 31 NULL NULL
  668. 201 1 NULL NULL 200 2
  669. 401 1 NULL NULL 400 4
  670. query IIIIIIII rowsort
  671. SELECT * FROM t1 FULL OUTER JOIN t2 ON t1.x=t2.x
  672. ----
  673. 10 1 11 1 100 1 1 101
  674. 20 2 21 1 NULL NULL NULL NULL
  675. 30 3 31 1 NULL NULL NULL NULL
  676. NULL NULL NULL NULL 200 1 201 2
  677. NULL NULL NULL NULL 400 1 401 4
  678. # not in spec
  679. # query III
  680. # SELECT t2.x, t1.x, x FROM t1 JOIN t2 USING (x)
  681. # ----
  682. # 1 1 1
  683. # not in spec
  684. # query III rowsort
  685. # SELECT t2.x, t1.x, x FROM t1 FULL OUTER JOIN t2 USING (x)
  686. # ----
  687. # 1 1 1
  688. # NULL 2 2
  689. # NULL 3 3
  690. # 201 NULL 201
  691. # 401 NULL 401
  692. # Test for materialize#19536.
  693. query I
  694. SELECT x FROM t1 NATURAL JOIN (SELECT * FROM t2)
  695. ----
  696. 1
  697. # Tests for merge join ordering information.
  698. statement ok
  699. CREATE TABLE pkBA (a INT, b INT, c INT, d INT, PRIMARY KEY(b,a))
  700. statement ok
  701. CREATE TABLE pkBC (a INT, b INT, c INT, d INT, PRIMARY KEY(b,c))
  702. statement ok
  703. CREATE TABLE pkBAC (a INT, b INT, c INT, d INT, PRIMARY KEY(b,a,c))
  704. statement ok
  705. CREATE TABLE pkBAD (a INT, b INT, c INT, d INT, PRIMARY KEY(b,a,d))
  706. # not supported yet
  707. # # Tests with joins with merged columns of collated string type.
  708. # statement ok
  709. # CREATE TABLE str1 (a INT PRIMARY KEY, s STRING COLLATE en_u_ks_level1)
  710. #
  711. # statement ok
  712. # INSERT INTO str1 VALUES (1, 'a' COLLATE en_u_ks_level1), (2, 'A' COLLATE en_u_ks_level1), (3, 'c' COLLATE en_u_ks_level1), (4, 'D' COLLATE en_u_ks_level1)
  713. #
  714. # statement ok
  715. # CREATE TABLE str2 (a INT PRIMARY KEY, s STRING COLLATE en_u_ks_level1)
  716. #
  717. # statement ok
  718. # INSERT INTO str2 VALUES (1, 'A' COLLATE en_u_ks_level1), (2, 'B' COLLATE en_u_ks_level1), (3, 'C' COLLATE en_u_ks_level1), (4, 'E' COLLATE en_u_ks_level1)
  719. #
  720. # query TTT rowsort
  721. # SELECT s, str1.s, str2.s FROM str1 INNER JOIN str2 USING (s)
  722. # ----
  723. # a a A
  724. # A A A
  725. # c c C
  726. #
  727. # query TTT rowsort
  728. # SELECT s, str1.s, str2.s FROM str1 LEFT OUTER JOIN str2 USING (s)
  729. # ----
  730. # a a A
  731. # A A A
  732. # c c C
  733. # D D NULL
  734. #
  735. # query TTT rowsort
  736. # SELECT s, str1.s, str2.s FROM str1 RIGHT OUTER JOIN str2 USING (s)
  737. # ----
  738. # a a A
  739. # A A A
  740. # c c C
  741. # B NULL B
  742. # E NULL E
  743. #
  744. # query TTT rowsort
  745. # SELECT s, str1.s, str2.s FROM str1 FULL OUTER JOIN str2 USING (s)
  746. # ----
  747. # a a A
  748. # A A A
  749. # c c C
  750. # D D NULL
  751. # E NULL E
  752. # B NULL B
  753. statement ok
  754. CREATE TABLE xyu (x INT, y INT, u INT, PRIMARY KEY(x,y,u))
  755. statement ok
  756. INSERT INTO xyu VALUES (0, 0, 0), (1, 1, 1), (3, 1, 31), (3, 2, 32), (4, 4, 44)
  757. statement ok
  758. CREATE TABLE xyv (x INT, y INT, v INT, PRIMARY KEY(x,y,v))
  759. statement ok
  760. INSERT INTO xyv VALUES (1, 1, 1), (2, 2, 2), (3, 1, 31), (3, 3, 33), (5, 5, 55)
  761. query IIII
  762. SELECT * FROM xyu INNER JOIN xyv USING (x, y) WHERE x > 2
  763. ----
  764. 3 1 31 31
  765. query IIII rowsort
  766. SELECT * FROM xyu LEFT OUTER JOIN xyv USING (x, y) WHERE x > 2
  767. ----
  768. 3 1 31 31
  769. 3 2 32 NULL
  770. 4 4 44 NULL
  771. query IIII rowsort
  772. SELECT * FROM xyu RIGHT OUTER JOIN xyv USING (x, y) WHERE x > 2
  773. ----
  774. 3 1 31 31
  775. 3 3 NULL 33
  776. 5 5 NULL 55
  777. query IIII rowsort
  778. SELECT * FROM xyu FULL OUTER JOIN xyv USING (x, y) WHERE x > 2
  779. ----
  780. 3 1 31 31
  781. 3 2 32 NULL
  782. 4 4 44 NULL
  783. 3 3 NULL 33
  784. 5 5 NULL 55
  785. query IIIIII
  786. SELECT * FROM xyu INNER JOIN xyv ON xyu.x = xyv.x AND xyu.y = xyv.y WHERE xyu.x = 1 AND xyu.y < 10
  787. ----
  788. 1 1 1 1 1 1
  789. query IIIIII
  790. SELECT * FROM xyu INNER JOIN xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
  791. ----
  792. 1 1 1 1 1 1
  793. query IIIIII rowsort
  794. SELECT * FROM xyu LEFT OUTER JOIN xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
  795. ----
  796. 0 0 0 NULL NULL NULL
  797. 1 1 1 1 1 1
  798. 3 1 31 NULL NULL NULL
  799. 3 2 32 NULL NULL NULL
  800. 4 4 44 NULL NULL NULL
  801. query IIIIII rowsort
  802. SELECT * FROM xyu RIGHT OUTER JOIN xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
  803. ----
  804. 1 1 1 1 1 1
  805. NULL NULL NULL 3 1 31
  806. NULL NULL NULL 3 3 33
  807. NULL NULL NULL 5 5 55
  808. NULL NULL NULL 2 2 2
  809. # Test OUTER joins that are run in the distSQL merge joiner
  810. query IIII rowsort
  811. SELECT * FROM (SELECT * FROM xyu ORDER BY x, y) AS xyu LEFT OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv USING (x, y) WHERE x > 2
  812. ----
  813. 3 1 31 31
  814. 3 2 32 NULL
  815. 4 4 44 NULL
  816. query IIII rowsort
  817. SELECT * FROM (SELECT * FROM xyu ORDER BY x, y) AS xyu RIGHT OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv USING (x, y) WHERE x > 2
  818. ----
  819. 3 1 31 31
  820. 3 3 NULL 33
  821. 5 5 NULL 55
  822. query IIII rowsort
  823. SELECT * FROM (SELECT * FROM xyu ORDER BY x, y) AS xyu FULL OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv USING (x, y) WHERE x > 2
  824. ----
  825. 3 1 31 31
  826. 3 2 32 NULL
  827. 4 4 44 NULL
  828. 3 3 NULL 33
  829. 5 5 NULL 55
  830. query IIIIII rowsort
  831. SELECT * FROM (SELECT * FROM xyu ORDER BY x, y) AS xyu LEFT OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
  832. ----
  833. 0 0 0 NULL NULL NULL
  834. 1 1 1 1 1 1
  835. 3 1 31 NULL NULL NULL
  836. 3 2 32 NULL NULL NULL
  837. 4 4 44 NULL NULL NULL
  838. query IIIIII rowsort
  839. SELECT * FROM xyu RIGHT OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
  840. ----
  841. 1 1 1 1 1 1
  842. NULL NULL NULL 3 1 31
  843. NULL NULL NULL 3 3 33
  844. NULL NULL NULL 5 5 55
  845. NULL NULL NULL 2 2 2
  846. # Regression test for materialize#20858.
  847. statement ok
  848. CREATE TABLE l (a INT PRIMARY KEY)
  849. statement ok
  850. CREATE TABLE r (a INT PRIMARY KEY)
  851. statement ok
  852. INSERT INTO l VALUES (1), (2), (3)
  853. statement ok
  854. INSERT INTO r VALUES (2), (3), (4)
  855. query I
  856. SELECT * FROM l LEFT OUTER JOIN r USING (a) WHERE a = 1
  857. ----
  858. 1
  859. query I
  860. SELECT * FROM l LEFT OUTER JOIN r USING (a) WHERE a = 2
  861. ----
  862. 2
  863. query I
  864. SELECT * FROM l RIGHT OUTER JOIN r USING (a) WHERE a = 3
  865. ----
  866. 3
  867. query I
  868. SELECT * FROM l RIGHT OUTER JOIN r USING (a) WHERE a = 4
  869. ----
  870. 4
  871. # Regression tests for mixed-type equality columns (database-issues#6807).
  872. statement ok
  873. CREATE TABLE foo (
  874. a INT,
  875. b INT,
  876. c FLOAT,
  877. d FLOAT
  878. )
  879. statement ok
  880. INSERT INTO foo VALUES
  881. (1, 1, 1.0, 1.0),
  882. (2, 2, 2.0, 2.0),
  883. (3, 3, 3.0, 3.0)
  884. statement ok
  885. CREATE TABLE bar (
  886. a INT,
  887. b FLOAT,
  888. c FLOAT,
  889. d INT
  890. )
  891. statement ok
  892. INSERT INTO bar VALUES
  893. (1, 1.0, 1.0, 1),
  894. (2, 2.0, 2.0, 2),
  895. (3, 3.0, 3.0, 3)
  896. # TODO(benesch): support these mixed-type equalities.
  897. #
  898. # query IIRR rowsort
  899. # SELECT * FROM foo NATURAL JOIN bar
  900. # ----
  901. # 1 1 1 1
  902. # 2 2 2 2
  903. # 3 3 3 3
  904. #
  905. # query IIRRIRI rowsort
  906. # SELECT * FROM foo JOIN bar USING (b)
  907. # ----
  908. # 1 1 1 1 1 1 1
  909. # 2 2 2 2 2 2 2
  910. # 3 3 3 3 3 3 3
  911. #
  912. # query IIRRRI rowsort
  913. # SELECT * FROM foo JOIN bar USING (a, b)
  914. # ----
  915. # 1 1 1 1 1 1
  916. # 2 2 2 2 2 2
  917. # 3 3 3 3 3 3
  918. #
  919. # query IIRRI rowsort
  920. # SELECT * FROM foo JOIN bar USING (a, b, c)
  921. # ----
  922. # 1 1 1 1 1
  923. # 2 2 2 2 2
  924. # 3 3 3 3 3
  925. #
  926. # query IIRRIRRI rowsort
  927. # SELECT * FROM foo JOIN bar ON foo.b = bar.b
  928. # ----
  929. # 1 1 1 1 1 1 1 1
  930. # 2 2 2 2 2 2 2 2
  931. # 3 3 3 3 3 3 3 3
  932. #
  933. # query IIRRIRRI rowsort
  934. # SELECT * FROM foo JOIN bar ON foo.a = bar.a AND foo.b = bar.b
  935. # ----
  936. # 1 1 1 1 1 1 1 1
  937. # 2 2 2 2 2 2 2 2
  938. # 3 3 3 3 3 3 3 3
  939. #
  940. # query IIRRIRRI rowsort
  941. # SELECT * FROM foo, bar WHERE foo.b = bar.b
  942. # ----
  943. # 1 1 1 1 1 1 1 1
  944. # 2 2 2 2 2 2 2 2
  945. # 3 3 3 3 3 3 3 3
  946. #
  947. # query IIRRIRRI rowsort
  948. # SELECT * FROM foo, bar WHERE foo.a = bar.a AND foo.b = bar.b
  949. # ----
  950. # 1 1 1 1 1 1 1 1
  951. # 2 2 2 2 2 2 2 2
  952. # 3 3 3 3 3 3 3 3
  953. #
  954. # query IIRRRI rowsort
  955. # SELECT * FROM foo JOIN bar USING (a, b) WHERE foo.c = bar.c AND foo.d = bar.d
  956. # ----
  957. # 1 1 1 1 1 1
  958. # 2 2 2 2 2 2
  959. # 3 3 3 3 3 3
  960. # # Regression test for 23664.
  961. # query III rowsort
  962. # SELECT * FROM onecolumn AS a(x) RIGHT JOIN twocolumn ON false
  963. # ----
  964. # NULL 44 51
  965. # NULL NULL 52
  966. # NULL 42 53
  967. # NULL 45 45
  968. # # Regression test for materialize#23609: make sure that the type of the merged column
  969. # # is int (not unknown).
  970. # query II rowsort
  971. # SELECT column1, column1+1
  972. # FROM
  973. # (SELECT * FROM
  974. # (VALUES (NULL, NULL)) AS t
  975. # NATURAL FULL OUTER JOIN
  976. # (VALUES (1, 1)) AS u)
  977. # ----
  978. # 1 2
  979. # NULL NULL
  980. # Regression test for materialize#28817. Do not allow special functions in ON clause.
  981. query error db error: ERROR: table functions are not allowed in ON clause \(function pg_catalog\.generate_series\)
  982. SELECT * FROM foo JOIN bar ON generate_series(0, 1) < 2
  983. query error aggregate functions are not allowed in ON
  984. SELECT * FROM foo JOIN bar ON max(foo.c) < 2