order_by.slt 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. mode cockroach
  10. statement ok
  11. CREATE TABLE foo (
  12. a int,
  13. b text
  14. )
  15. statement ok
  16. INSERT INTO foo (a, b) VALUES (0, 'zero'), (1, 'one'), (2, 'two')
  17. query I nosort
  18. SELECT a FROM foo ORDER BY a
  19. ----
  20. 0
  21. 1
  22. 2
  23. query I nosort
  24. SELECT a FROM foo ORDER BY a DESC
  25. ----
  26. 2
  27. 1
  28. 0
  29. query I nosort
  30. SELECT a + 1 FROM foo ORDER BY a + 1
  31. ----
  32. 1
  33. 2
  34. 3
  35. query I nosort
  36. SELECT 2*a as d
  37. FROM foo
  38. ORDER BY d;
  39. ----
  40. 0
  41. 2
  42. 4
  43. query I nosort
  44. SELECT 2*a as d
  45. FROM foo
  46. ORDER BY -2*a;
  47. ----
  48. 4
  49. 2
  50. 0
  51. # This looks a bit weird if we compare it with the previous two tests, but Postgres does the same
  52. # See https://www.postgresql.org/docs/current/queries-order.html
  53. # "Note that an output column name has to stand alone, that is, it cannot be used in an expression"
  54. query error db error: ERROR: column "d" does not exist
  55. SELECT 2*a as d
  56. FROM foo
  57. ORDER BY -d;
  58. query I nosort
  59. SELECT sum(a) FROM foo ORDER BY sum(a)
  60. ----
  61. 3
  62. query error db error: ERROR: column "foo\.a" must appear in the GROUP BY clause or be used in an aggregate function
  63. SELECT a FROM foo ORDER BY sum(a);
  64. query error db error: ERROR: column "foo\.a" must appear in the GROUP BY clause or be used in an aggregate function
  65. SELECT sum(a) FROM foo ORDER BY a;
  66. query error db error: ERROR: column "foo\.b" must appear in the GROUP BY clause or be used in an aggregate function
  67. SELECT sum(a) FROM foo ORDER BY sum(a), b;
  68. query error db error: ERROR: column "foo\.b" must appear in the GROUP BY clause or be used in an aggregate function
  69. SELECT sum(a), b FROM foo ORDER BY sum(a), b;
  70. query I nosort
  71. SELECT sum(a)
  72. FROM foo
  73. GROUP BY b
  74. ORDER BY sum(a), b;
  75. ----
  76. 0
  77. 1
  78. 2
  79. query I nosort
  80. SELECT sum(a)
  81. FROM foo
  82. GROUP BY b
  83. ORDER BY -sum(a), b;
  84. ----
  85. 2
  86. 1
  87. 0
  88. query I nosort
  89. SELECT right_a
  90. FROM foo LEFT JOIN (SELECT a as right_a FROM foo WHERE a<2) ON foo.a = right_a
  91. GROUP BY b, right_a
  92. ORDER BY -right_a, -sum(foo.a), b;
  93. ----
  94. 1
  95. 0
  96. NULL
  97. query IIT nosort
  98. SELECT lag(10*right_a+3) OVER (ORDER BY right_a NULLS FIRST), -sum(foo.a), b
  99. FROM foo LEFT JOIN (SELECT a as right_a FROM foo WHERE a<2) ON foo.a = right_a
  100. GROUP BY b, right_a
  101. ORDER BY lag(10*right_a+3) OVER (ORDER BY right_a NULLS FIRST), -sum(foo.a), b;
  102. ----
  103. 3 -1 one
  104. NULL -2 two
  105. NULL 0 zero
  106. query IT nosort
  107. SELECT -sum(foo.a), b
  108. FROM foo LEFT JOIN (SELECT a as right_a FROM foo WHERE a<2) ON foo.a = right_a
  109. GROUP BY b, right_a
  110. ORDER BY lag(10*right_a+3) OVER (ORDER BY right_a NULLS FIRST), -sum(foo.a), b;
  111. ----
  112. -1 one
  113. -2 two
  114. 0 zero
  115. query IIT nosort
  116. SELECT lag(10*right_a+3) OVER (ORDER BY right_a NULLS FIRST), sum(foo.a), length(b)
  117. FROM foo LEFT JOIN (SELECT a as right_a FROM foo WHERE a<2) ON foo.a = right_a
  118. GROUP BY b, right_a
  119. ORDER BY lag(10*right_a+3) OVER (ORDER BY right_a NULLS FIRST), -sum(foo.a)/10, length(b) DESC NULLS FIRST;
  120. ----
  121. 3 1 3
  122. NULL 0 4
  123. NULL 2 3
  124. query I nosort
  125. SELECT 10-sum(a)
  126. FROM foo
  127. GROUP BY b
  128. ORDER BY 1;
  129. ----
  130. 8
  131. 9
  132. 10
  133. query error db error: ERROR: column reference 2 in ORDER BY clause is out of range \(1 \- 1\)
  134. SELECT 10-sum(a)
  135. FROM foo
  136. GROUP BY b
  137. ORDER BY 2;
  138. query II nosort
  139. SELECT 10-sum(a), lag(sum(a)) OVER (ORDER BY sum(a))
  140. FROM foo
  141. GROUP BY b
  142. ORDER BY 2;
  143. ----
  144. 9 0
  145. 8 1
  146. 10 NULL
  147. query error db error: ERROR: column reference 3 in ORDER BY clause is out of range \(1 \- 2\)
  148. SELECT 10-sum(a), lag(sum(a)) OVER (ORDER BY sum(a))
  149. FROM foo
  150. GROUP BY b
  151. ORDER BY 3;
  152. query II
  153. SELECT a, lag(a) OVER (ORDER BY a) as d
  154. FROM foo
  155. ORDER BY d;
  156. ----
  157. 1 0
  158. 2 1
  159. 0 NULL
  160. # When an ORDER BY refers to an output column name, the column name can't be part of a bigger expression.
  161. # (This is the same in Postgres.)
  162. query error db error: ERROR: column "d" does not exist
  163. SELECT a, lag(a) OVER (ORDER BY a) as d
  164. FROM foo
  165. ORDER BY -d;
  166. query error db error: ERROR: column "d" does not exist
  167. SELECT a, 2*a as d
  168. FROM foo
  169. ORDER BY lag(d) OVER (ORDER BY d);
  170. query I nosort
  171. SELECT a FROM foo ORDER BY (0-a)
  172. ----
  173. 2
  174. 1
  175. 0
  176. # ORDER BY can implicitly project columns from the inner SELECT...
  177. query I
  178. SELECT a FROM foo ORDER BY b
  179. ----
  180. 1
  181. 2
  182. 0
  183. # ...including when they are used in functions...
  184. query I
  185. SELECT a FROM foo ORDER BY b || 'blah'
  186. ----
  187. 1
  188. 2
  189. 0
  190. # ...or even in aggregate functions...
  191. query I
  192. SELECT a FROM foo GROUP BY a ORDER BY max(b)
  193. ----
  194. 1
  195. 2
  196. 0
  197. # ...unless you use DISTINCT...
  198. query error for SELECT DISTINCT, ORDER BY expressions must appear in select list
  199. SELECT DISTINCT a FROM foo ORDER BY b
  200. query error for SELECT DISTINCT, ORDER BY expressions must appear in select list
  201. SELECT DISTINCT a FROM foo ORDER BY a + 1
  202. # ...or a set expression.
  203. query error column "b" does not exist
  204. (SELECT a FROM foo) UNION (SELECT a FROM foo) ORDER BY b
  205. # We should pick up the column name from the first input of UNION.
  206. query I
  207. (SELECT a FROM foo)
  208. UNION
  209. (SELECT a-3 FROM foo)
  210. ORDER BY a;
  211. ----
  212. -3
  213. -2
  214. -1
  215. 0
  216. 1
  217. 2
  218. query I
  219. (SELECT a FROM foo)
  220. UNION
  221. (SELECT a FROM foo)
  222. ORDER BY a;
  223. ----
  224. 0
  225. 1
  226. 2
  227. query error ERROR: column "a" does not exist
  228. (SELECT a-3 FROM foo)
  229. UNION
  230. (SELECT a FROM foo)
  231. ORDER BY a;
  232. # We support complex expressions in the ORDER BY of a set expression (Postgres doesn't).
  233. query I
  234. (SELECT a FROM foo)
  235. UNION
  236. (SELECT a-3 FROM foo)
  237. ORDER BY -2*a+3;
  238. ----
  239. 2
  240. 1
  241. 0
  242. -1
  243. -2
  244. -3
  245. # But we don't support aggregations in the ORDER BY of a set expression (same in Postgres)
  246. query error db error: ERROR: aggregate functions are not allowed in ORDER BY clause of a set expression \(function pg_catalog\.sum\)
  247. (SELECT a FROM foo)
  248. UNION
  249. (SELECT a-3 FROM foo)
  250. ORDER BY sum(a);
  251. # ... or window functions (same in Postgres).
  252. query error db error: ERROR: window functions are not allowed in ORDER BY clause of a set expression \(function pg_catalog\.lag\)
  253. (SELECT a FROM foo)
  254. UNION
  255. (SELECT a-3 FROM foo)
  256. ORDER BY lag(a) OVER ();
  257. # We support window functions in a normal ORDER BY, though
  258. query I
  259. SELECT a FROM foo
  260. ORDER BY lag(a) OVER (ORDER BY a) NULLS LAST;
  261. ----
  262. 1
  263. 2
  264. 0
  265. query I
  266. SELECT a FROM foo
  267. ORDER BY lag(a) OVER (ORDER BY -a NULLS FIRST) DESC NULLS LAST;
  268. ----
  269. 1
  270. 0
  271. 2
  272. # We support subqueries in ORDER BY
  273. query IT
  274. SELECT a, b FROM foo
  275. ORDER BY a IN (SELECT length(b)-1 FROM foo), -a;
  276. ----
  277. 1 one
  278. 0 zero
  279. 2 two
  280. # ... even for a set expression
  281. query I
  282. (SELECT a FROM foo)
  283. UNION
  284. (SELECT a+1 FROM foo)
  285. ORDER BY a IN (SELECT length(b)-1 FROM foo), -a;
  286. ----
  287. 1
  288. 0
  289. 3
  290. 2
  291. # Using a column twice and referring to it by its alias in the ORDER BY should
  292. # work.
  293. query II
  294. SELECT a, a AS c FROM foo ORDER BY c
  295. ----
  296. 0 0
  297. 1 1
  298. 2 2
  299. # Columns introduced in the select list are not available when using an
  300. # arbitrary ORDER BY expression.
  301. query error column "c" does not exist
  302. SELECT a + 1 AS c FROM foo ORDER BY a + c
  303. # When a name from the underlying table is shadowed, using the shadowed name in
  304. # the ORDER BY should refer to the column in the select list...
  305. query T
  306. SELECT b AS a FROM foo ORDER BY a
  307. ----
  308. one
  309. two
  310. zero
  311. # ...unless the shadowed name is ambiguous...
  312. query error column reference "a" is ambiguous
  313. SELECT 1 AS a, b AS a FROM foo ORDER BY a
  314. # ..or the ORDER BY is an arbitrary expression.
  315. query T
  316. SELECT b AS a FROM foo ORDER BY -a
  317. ----
  318. two
  319. one
  320. zero
  321. statement ok
  322. CREATE TABLE bar (a int)
  323. statement ok
  324. INSERT INTO bar (a) VALUES (1)
  325. query I nosort
  326. SELECT a FROM foo ORDER BY exists (SELECT * FROM bar WHERE bar.a = foo.a), a
  327. ----
  328. 0
  329. 2
  330. 1
  331. query TI nosort
  332. SELECT b, a FROM foo ORDER BY b
  333. ----
  334. one 1
  335. two 2
  336. zero 0
  337. # Ensure SELECT DISTINCT is not confused by permuting columns in the SELECT
  338. # list.
  339. query TI nosort
  340. SELECT DISTINCT b, a FROM foo ORDER BY b
  341. ----
  342. one 1
  343. two 2
  344. zero 0
  345. # LIMIT (or FETCH) and OFFSET should be accepted in any order. (Postgres also does, and Monte Carlo needs this.)
  346. query TI
  347. SELECT b, a
  348. FROM foo
  349. ORDER BY b
  350. LIMIT 2;
  351. ----
  352. one 1
  353. two 2
  354. query TI
  355. SELECT b, a
  356. FROM foo
  357. ORDER BY b
  358. FETCH FIRST 2 ROWS ONLY;
  359. ----
  360. one 1
  361. two 2
  362. query TI
  363. SELECT b, a
  364. FROM foo
  365. ORDER BY b
  366. LIMIT 2 OFFSET 1;
  367. ----
  368. two 2
  369. zero 0
  370. query TI
  371. SELECT b, a
  372. FROM foo
  373. ORDER BY b
  374. FETCH FIRST 2 ROWS ONLY OFFSET 1;
  375. ----
  376. two 2
  377. zero 0
  378. query TI
  379. SELECT b, a
  380. FROM foo
  381. ORDER BY b
  382. OFFSET 1 LIMIT 1;
  383. ----
  384. two 2
  385. query TI
  386. SELECT b, a
  387. FROM foo
  388. ORDER BY b
  389. OFFSET 1;
  390. ----
  391. two 2
  392. zero 0
  393. # FETCH FIRST and FETCH NEXT mean the same thing.
  394. query TI
  395. SELECT b, a
  396. FROM foo
  397. ORDER BY b
  398. OFFSET 1
  399. FETCH FIRST 1 ROWS ONLY;
  400. ----
  401. two 2
  402. query TI
  403. SELECT b, a
  404. FROM foo
  405. ORDER BY b
  406. OFFSET 1
  407. FETCH NEXT 1 ROWS ONLY;
  408. ----
  409. two 2
  410. # OFFSET can have optional ROW or ROWS (which doesn't mean anything)
  411. query TI
  412. SELECT b, a
  413. FROM foo
  414. ORDER BY b
  415. OFFSET 1 ROW LIMIT 3;
  416. ----
  417. two 2
  418. zero 0
  419. query TI
  420. SELECT b, a
  421. FROM foo
  422. ORDER BY b
  423. OFFSET 1 ROWS LIMIT 3;
  424. ----
  425. two 2
  426. zero 0
  427. # Multiple LIMIT/FETCH or multiple OFFSET not allowed
  428. query error multiple LIMIT/FETCH clauses not allowed
  429. SELECT b, a
  430. FROM foo
  431. ORDER BY b
  432. LIMIT 1 LIMIT 2;
  433. query error multiple LIMIT/FETCH clauses not allowed
  434. SELECT b, a
  435. FROM foo
  436. ORDER BY b
  437. LIMIT 1
  438. FETCH FIRST 3 ROWS ONLY;
  439. query error multiple OFFSET clauses not allowed
  440. SELECT b, a
  441. FROM foo
  442. ORDER BY b
  443. OFFSET 1 OFFSET 2;
  444. query error multiple LIMIT/FETCH clauses not allowed
  445. SELECT b, a
  446. FROM foo
  447. ORDER BY b
  448. LIMIT 1 OFFSET 1 LIMIT 2;
  449. query error multiple OFFSET clauses not allowed
  450. SELECT b, a
  451. FROM foo
  452. ORDER BY b
  453. OFFSET 1 LIMIT 3 OFFSET 2;
  454. query error multiple OFFSET clauses not allowed
  455. SELECT b, a
  456. FROM foo
  457. ORDER BY b
  458. OFFSET 1 OFFSET 2 LIMIT 3;
  459. ### sorts, limits, and offsets in subqueries ###
  460. # These tests have been designed to cover a wide range of situations where there
  461. # may be a subquery. Be sure when modifying these tests to maintain a
  462. # representation for each situation.
  463. statement ok
  464. CREATE TABLE fizz(a int, b text)
  465. statement ok
  466. INSERT INTO fizz(a, b) VALUES
  467. (2079, 'thirteen'), (12345, 'one'),
  468. (12345, 'two'), (12345, 'three'),
  469. (6745, 'five'), (24223, 'four'),
  470. (21243, 'four'), (1735, 'two'),
  471. (25040, 'two')
  472. # the ORDER BY's inside the subquery are technically meaningless because they do not
  473. # propagate to the outer query, but we should still return correct results.
  474. query T rowsort
  475. SELECT b FROM (SELECT min(b) AS b FROM fizz GROUP BY a ORDER BY a DESC)
  476. ----
  477. five
  478. four
  479. four
  480. one
  481. thirteen
  482. two
  483. two
  484. query I rowsort
  485. SELECT ascii(b) FROM (SELECT a, b FROM fizz ORDER BY a ASC, b DESC)
  486. ----
  487. 102
  488. 102
  489. 102
  490. 111
  491. 116
  492. 116
  493. 116
  494. 116
  495. 116
  496. statement ok
  497. CREATE TABLE baz (
  498. val1 int,
  499. val2 int
  500. )
  501. statement ok
  502. INSERT INTO baz VALUES
  503. (12345, 1735), (12345, 1735), (12345, 1735),
  504. (1735, 24223), (12345, 12345), (2079, 24223),
  505. (1735, 2079), (1735, 2079), (1735, 2079)
  506. # offset
  507. query I rowsort
  508. SELECT a FROM fizz WHERE a > ANY(SELECT val1 FROM baz ORDER BY val1 offset 3 ROWS)
  509. ----
  510. 12345
  511. 12345
  512. 12345
  513. 2079
  514. 21243
  515. 24223
  516. 25040
  517. 6745
  518. query I rowsort
  519. SELECT a FROM fizz WHERE a IN (SELECT val1 FROM baz ORDER BY val1 offset 0 rows)
  520. ----
  521. 12345
  522. 12345
  523. 12345
  524. 1735
  525. 2079
  526. # limit
  527. query I
  528. SELECT a FROM fizz WHERE a < ALL(SELECT val1 FROM baz ORDER BY val1 DESC limit 5)
  529. ----
  530. 1735
  531. query I
  532. SELECT count(*) FROM fizz WHERE exists(SELECT val1 FROM baz ORDER BY val1 limit 0)
  533. ----
  534. 0
  535. query error FETCH ... WITH TIES not yet supported
  536. SELECT * FROM fizz FETCH FIRST 2 ROWS WITH TIES
  537. # offset + limit
  538. query TI
  539. SELECT b, (SELECT val1 FROM baz WHERE val2 = a ORDER BY val1 limit 1 offset 1 rows) c
  540. FROM fizz ORDER BY b, c DESC
  541. ----
  542. five NULL
  543. four NULL
  544. four 2079
  545. one NULL
  546. thirteen 1735
  547. three NULL
  548. two NULL
  549. two NULL
  550. two 12345
  551. # limit + offset return correct results when there are identical rows
  552. query I
  553. SELECT val1 FROM (SELECT val1, val2 FROM baz ORDER BY val2 LIMIT 2)
  554. ----
  555. 12345
  556. 12345
  557. query I
  558. SELECT val1 FROM (SELECT val1, val2 FROM baz ORDER BY val2 DESC OFFSET 7 ROWS)
  559. ----
  560. 12345
  561. 12345
  562. query I rowsort
  563. SELECT val1 FROM (SELECT val1, val2 FROM baz ORDER BY val2 LIMIT 2 OFFSET 2 ROWS)
  564. ----
  565. 1735
  566. 12345
  567. query I
  568. SELECT val1 FROM (SELECT val1, val2 FROM baz ORDER BY val2 DESC LIMIT 1 OFFSET 7 ROWS)
  569. ----
  570. 12345
  571. # ORDER BY/limit/offset in subqueries still works after deleting some entries
  572. # Note: the parentheses around the SELECT statement currently makes it a subquery
  573. # test. Change the test if we optimize so that the SELECT is no longer treated
  574. # as a subquery.
  575. statement ok
  576. CREATE VIEW bazv AS (SELECT val1, val2 FROM baz ORDER BY val2 DESC, val1 LIMIT 2 OFFSET 1 ROW)
  577. query II rowsort
  578. SELECT * FROM bazv
  579. ----
  580. 2079 24223
  581. 12345 12345
  582. statement ok
  583. DELETE FROM baz WHERE val1=12345
  584. query II rowsort
  585. SELECT * FROM bazv
  586. ----
  587. 1735 2079
  588. 2079 24223
  589. ### ORDER BY/offset/limit in toplevel select query in view creation ###
  590. statement ok
  591. CREATE VIEW fizzorderview AS SELECT a, b FROM fizz ORDER BY a DESC, b
  592. # TODO: database-issues#236 take out the rowsort and rearrange results
  593. # when ORDER BY's persist past the view creation
  594. query IT rowsort
  595. SELECT * FROM fizzorderview
  596. ----
  597. 12345 one
  598. 12345 three
  599. 12345 two
  600. 1735 two
  601. 2079 thirteen
  602. 6745 five
  603. 21243 four
  604. 24223 four
  605. 25040 two
  606. statement ok
  607. CREATE VIEW fizzlimitview AS SELECT a, b FROM fizz LIMIT 4
  608. query II
  609. SELECT count(a), count(b) FROM fizzlimitview
  610. ----
  611. 4 4
  612. statement ok
  613. CREATE VIEW fizzlimitview2 AS SELECT b, a FROM fizz ORDER BY a ASC LIMIT 2
  614. query TI rowsort
  615. SELECT * FROM fizzlimitview2
  616. ----
  617. thirteen 2079
  618. two 1735
  619. statement ok
  620. CREATE VIEW fizzoffsetview AS SELECT a, b FROM fizz OFFSET 6 ROWS
  621. query II
  622. SELECT count(b), count(a) FROM fizzoffsetview
  623. ----
  624. 3 3
  625. statement ok
  626. CREATE VIEW fizzoffsetview2 AS SELECT b, a FROM fizz ORDER BY b DESC, a OFFSET 3 ROWS
  627. query TI rowsort
  628. SELECT * FROM fizzoffsetview2
  629. ----
  630. four 21243
  631. four 24223
  632. five 6745
  633. one 12345
  634. thirteen 2079
  635. three 12345
  636. statement ok
  637. CREATE VIEW fizzlimitoffsetview AS SELECT sum(a) AS tot, b FROM fizz GROUP BY b
  638. ORDER BY tot LIMIT 1 OFFSET 4 ROWS
  639. query I
  640. SELECT count(tot) FROM fizzlimitoffsetview
  641. ----
  642. 1
  643. statement ok
  644. CREATE VIEW fizzlimitoffsetview2 AS SELECT avg(a), b FROM fizz GROUP BY b
  645. ORDER BY b DESC LIMIT 3 OFFSET 2 ROWS
  646. query RT rowsort
  647. SELECT * FROM fizzlimitoffsetview2
  648. ----
  649. 12345 one
  650. 2079 thirteen
  651. 22733 four
  652. # delete and add an entry see how views update
  653. statement ok
  654. DELETE FROM fizz WHERE b = 'thirteen'
  655. query IT rowsort
  656. SELECT * FROM fizzorderview
  657. ----
  658. 12345 one
  659. 12345 three
  660. 12345 two
  661. 1735 two
  662. 21243 four
  663. 24223 four
  664. 25040 two
  665. 6745 five
  666. query TI rowsort
  667. SELECT * FROM fizzlimitview2
  668. ----
  669. five 6745
  670. two 1735
  671. query II
  672. SELECT count(b), count(a) FROM fizzoffsetview
  673. ----
  674. 2 2
  675. query TI rowsort
  676. SELECT * FROM fizzoffsetview2
  677. ----
  678. five 6745
  679. four 21243
  680. four 24223
  681. one 12345
  682. three 12345
  683. query RT rowsort
  684. SELECT * FROM fizzlimitoffsetview2
  685. ----
  686. 12345 one
  687. 22733 four
  688. 6745 five
  689. statement ok
  690. DELETE FROM fizz WHERE b = 'five'
  691. query II
  692. SELECT count(a), count(b) FROM fizzlimitview
  693. ----
  694. 4 4
  695. query I
  696. SELECT count(tot) FROM fizzlimitoffsetview
  697. ----
  698. 0
  699. statement ok
  700. INSERT INTO fizz VALUES (7584, 'twelve'), (21758, 'fourteen')
  701. query IT rowsort
  702. SELECT * FROM fizzorderview
  703. ----
  704. 12345 one
  705. 12345 three
  706. 12345 two
  707. 1735 two
  708. 21243 four
  709. 21758 fourteen
  710. 24223 four
  711. 25040 two
  712. 7584 twelve
  713. query II
  714. SELECT count(a), count(b) FROM fizzlimitview
  715. ----
  716. 4 4
  717. query TI rowsort
  718. SELECT * FROM fizzlimitview2
  719. ----
  720. twelve 7584
  721. two 1735
  722. query II
  723. SELECT count(b), count(a) FROM fizzoffsetview
  724. ----
  725. 3 3
  726. query TI rowsort
  727. SELECT * FROM fizzoffsetview2
  728. ----
  729. four 21243
  730. four 24223
  731. fourteen 21758
  732. one 12345
  733. three 12345
  734. twelve 7584
  735. query I
  736. SELECT count(tot) FROM fizzlimitoffsetview
  737. ----
  738. 1
  739. query RT rowsort
  740. SELECT * FROM fizzlimitoffsetview2
  741. ----
  742. 12345 one
  743. 21758 fourteen
  744. 12345 three
  745. # NULL should sort last by default. See database-issues#1844.
  746. # NULL (default, default)
  747. query I
  748. SELECT * FROM (VALUES (NULL), (1)) ORDER BY column1
  749. ----
  750. 1
  751. NULL
  752. # NULL (asc, default)
  753. query I
  754. SELECT * FROM (VALUES (1), (NULL), (3), (2)) ORDER BY column1 asc
  755. ----
  756. 1
  757. 2
  758. 3
  759. NULL
  760. # NULL (desc, default)
  761. query I
  762. SELECT * FROM (VALUES (1), (NULL), (3), (2)) ORDER BY column1 desc
  763. ----
  764. NULL
  765. 3
  766. 2
  767. 1
  768. # NULL (default, last)
  769. query I
  770. SELECT * FROM (VALUES (1), (NULL), (3), (2)) ORDER BY column1 nulls last
  771. ----
  772. 1
  773. 2
  774. 3
  775. NULL
  776. # NULL (asc, last)
  777. query I
  778. SELECT * FROM (VALUES (1), (NULL), (3), (2)) ORDER BY column1 asc nulls last
  779. ----
  780. 1
  781. 2
  782. 3
  783. NULL
  784. # NULL (desc, last)
  785. query I
  786. SELECT * FROM (VALUES (1), (NULL), (3), (2)) ORDER BY column1 desc nulls last
  787. ----
  788. 3
  789. 2
  790. 1
  791. NULL
  792. # NULL (default, first)
  793. query I
  794. SELECT * FROM (VALUES (1), (NULL), (3), (2)) ORDER BY column1 nulls first
  795. ----
  796. NULL
  797. 1
  798. 2
  799. 3
  800. # NULL (asc, first)
  801. query I
  802. SELECT * FROM (VALUES (1), (NULL), (3), (2)) ORDER BY column1 asc nulls first
  803. ----
  804. NULL
  805. 1
  806. 2
  807. 3
  808. # NULL (desc, first)
  809. query I
  810. SELECT * FROM (VALUES (1), (NULL), (3), (2)) ORDER BY column1 desc nulls first
  811. ----
  812. NULL
  813. 3
  814. 2
  815. 1
  816. # Windows
  817. query IT rowsort
  818. WITH t (x) AS (VALUES ('a'), (NULL), ('b'), ('c'))
  819. SELECT row_number() OVER (ORDER BY x NULLS FIRST), x FROM t;
  820. ----
  821. 1 NULL
  822. 2 a
  823. 3 b
  824. 4 c
  825. query IT rowsort
  826. WITH t (x) AS (VALUES ('a'), (NULL), ('b'), ('c'))
  827. SELECT row_number() OVER (ORDER BY x NULLS LAST), x FROM t;
  828. ----
  829. 1 a
  830. 2 b
  831. 3 c
  832. 4 NULL
  833. statement ok
  834. DROP TABLE IF EXISTS t;
  835. statement ok
  836. CREATE TABLE t (x TEXT);
  837. statement ok
  838. INSERT INTO t VALUES ('a'), (NULL), ('b'), ('c');
  839. query IT rowsort
  840. SELECT row_number() OVER (ORDER BY x NULLS FIRST), x FROM t;
  841. ----
  842. 1 NULL
  843. 2 a
  844. 3 b
  845. 4 c
  846. query IT rowsort
  847. SELECT row_number() OVER (ORDER BY x NULLS LAST), x FROM t;
  848. ----
  849. 1 a
  850. 2 b
  851. 3 c
  852. 4 NULL
  853. ## TopK removal when it's completely covered by the finishing.
  854. ## See https://github.com/MaterializeInc/database-issues/issues/2498
  855. statement ok
  856. DROP TABLE t;
  857. statement ok
  858. CREATE TABLE t(x int, y int);
  859. # We could remove the TopK, but we don't do this on the slow path currently.
  860. query T multiline
  861. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (SELECT * FROM t LIMIT 10000) LIMIT 8000;
  862. ----
  863. Explained Query:
  864. Finish limit=8000 output=[#0, #1]
  865. TopK limit=10000
  866. ReadStorage materialize.public.t
  867. Source materialize.public.t
  868. Target cluster: quickstart
  869. EOF
  870. statement ok
  871. CREATE INDEX t_idx on t(x);
  872. # Same as above, but for fast path recognition we already do the TopK removal.
  873. query T multiline
  874. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (SELECT * FROM t LIMIT 10) LIMIT 8;
  875. ----
  876. Explained Query (fast path):
  877. Finish limit=8 output=[#0, #1]
  878. ReadIndex on=materialize.public.t t_idx=[*** full scan ***]
  879. Used Indexes:
  880. - materialize.public.t_idx (fast path limit)
  881. Target cluster: quickstart
  882. EOF
  883. # Same as above, but the finishing would need to be modified (merge the TopK into the finishing), because the TopK's
  884. # LIMIT is smaller. We don't do this currently, but it wouldn't be too difficult.
  885. query T multiline
  886. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (SELECT * FROM t LIMIT 8) LIMIT 10;
  887. ----
  888. Explained Query:
  889. Finish limit=10 output=[#0, #1]
  890. TopK limit=8
  891. ReadIndex on=t t_idx=[*** full scan ***]
  892. Used Indexes:
  893. - materialize.public.t_idx (*** full scan ***)
  894. Target cluster: quickstart
  895. EOF
  896. # A negative example for the TopK removal: The TopK has a grouping key, so it shouldn't be removed.
  897. query T multiline
  898. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (
  899. SELECT * FROM
  900. (SELECT DISTINCT x FROM t) grp,
  901. LATERAL (
  902. SELECT y FROM t
  903. WHERE x = grp.x
  904. ORDER BY y LIMIT 4
  905. )
  906. ) LIMIT 8;
  907. ----
  908. Explained Query:
  909. Finish limit=8 output=[#0, #1]
  910. TopK group_by=[#0{x}] order_by=[#1{y} asc nulls_last] limit=4
  911. Filter (#0{x}) IS NOT NULL
  912. ReadIndex on=t t_idx=[*** full scan ***]
  913. Used Indexes:
  914. - materialize.public.t_idx (*** full scan ***)
  915. Target cluster: quickstart
  916. EOF
  917. # A negative example for the TopK removal: The TopK has a different ordering key, so it shouldn't be removed.
  918. query T multiline
  919. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (SELECT * FROM t ORDER BY x LIMIT 10) ORDER BY y LIMIT 8;
  920. ----
  921. Explained Query:
  922. Finish order_by=[#1{y} asc nulls_last] limit=8 output=[#0, #1]
  923. TopK order_by=[#0{x} asc nulls_last] limit=10
  924. ReadIndex on=t t_idx=[*** full scan ***]
  925. Used Indexes:
  926. - materialize.public.t_idx (*** full scan ***)
  927. Target cluster: quickstart
  928. EOF
  929. # The TopK has an ordering key, but the finishing doesn't. We could merge the TopK into the finishing, but we don't
  930. # currently do this.
  931. query T multiline
  932. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (SELECT * FROM t ORDER BY x LIMIT 10) LIMIT 8;
  933. ----
  934. Explained Query:
  935. Finish limit=8 output=[#0, #1]
  936. TopK order_by=[#0{x} asc nulls_last] limit=10
  937. ReadIndex on=t t_idx=[*** full scan ***]
  938. Used Indexes:
  939. - materialize.public.t_idx (*** full scan ***)
  940. Target cluster: quickstart
  941. EOF
  942. # Trivial finishing. We could merge the TopK into the finishing, but we don't currently do this.
  943. query T multiline
  944. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (SELECT * FROM t ORDER BY x LIMIT 10);
  945. ----
  946. Explained Query:
  947. TopK order_by=[#0{x} asc nulls_last] limit=10
  948. ReadIndex on=t t_idx=[*** full scan ***]
  949. Used Indexes:
  950. - materialize.public.t_idx (*** full scan ***)
  951. Target cluster: quickstart
  952. EOF
  953. # A negative example for the TopK removal: The TopK's ordering key is a prefix of the RowSetFinishing's, so it shouldn't
  954. # be removed.
  955. query T multiline
  956. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (SELECT * FROM t ORDER BY x LIMIT 10) ORDER BY x, y LIMIT 8;
  957. ----
  958. Explained Query:
  959. Finish order_by=[#0{x} asc nulls_last, #1{y} asc nulls_last] limit=8 output=[#0, #1]
  960. TopK order_by=[#0{x} asc nulls_last] limit=10
  961. ReadIndex on=t t_idx=[*** full scan ***]
  962. Used Indexes:
  963. - materialize.public.t_idx (*** full scan ***)
  964. Target cluster: quickstart
  965. EOF
  966. # 3 nested LIMITs, so TopK fusion is needed to be able to go to fast path.
  967. query T multiline
  968. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (SELECT * FROM (SELECT * FROM t LIMIT 8) LIMIT 10) LIMIT 6;
  969. ----
  970. Explained Query (fast path):
  971. Finish limit=6 output=[#0, #1]
  972. ReadIndex on=materialize.public.t t_idx=[*** full scan ***]
  973. Used Indexes:
  974. - materialize.public.t_idx (fast path limit)
  975. Target cluster: quickstart
  976. EOF
  977. # The TopK has an offset, so we shouldn't remove it. (We could merge it into the finishing, but we don't do that
  978. # currently.)
  979. query T multiline
  980. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM (SELECT * FROM t LIMIT 10 OFFSET 3) LIMIT 8;
  981. ----
  982. Explained Query:
  983. Finish limit=8 output=[#0, #1]
  984. TopK limit=10 offset=3
  985. ReadIndex on=t t_idx=[*** full scan ***]
  986. Used Indexes:
  987. - materialize.public.t_idx (*** full scan ***)
  988. Target cluster: quickstart
  989. EOF
  990. ########################################################################################################################
  991. # Tests for prepared statement parameters in OFFSET, and for non-trivial expressions in OFFSET.
  992. # (Non-trivial expressions in OFFSET clauses have to be simplifiable to a literal, possibly after parameter binding.)
  993. #
  994. # LIMIT clauses with non-trivial expressions, referring to an outer context of a subquery, have tests in
  995. # `limit_expr.slt`.)
  996. #
  997. # For prepared statements managed through pgwire's Extended Query protocol, see `test_bind_params` in `pgwire.rs`.
  998. ########################################################################################################################
  999. statement ok
  1000. PREPARE p1 AS
  1001. SELECT *
  1002. FROM foo
  1003. ORDER BY a, b
  1004. OFFSET $1;
  1005. query IT
  1006. EXECUTE p1(0);
  1007. ----
  1008. 0 zero
  1009. 1 one
  1010. 2 two
  1011. query IT
  1012. EXECUTE p1(1);
  1013. ----
  1014. 1 one
  1015. 2 two
  1016. query IT
  1017. EXECUTE p1(1+1);
  1018. ----
  1019. 2 two
  1020. query error db error: ERROR: Invalid OFFSET clause: Expected an expression that evaluates to a non\-null value, got null
  1021. EXECUTE p1(null::bigint);
  1022. query error db error: ERROR: Invalid OFFSET clause: Expected an expression that evaluates to a non\-null value, got integer_to_bigint\(null\)
  1023. EXECUTE p1(coalesce(null + 5, 7 + null));
  1024. query error db error: ERROR: Invalid OFFSET clause: Expected an expression that evaluates to a non\-null value, got null
  1025. PREPARE p_error AS
  1026. SELECT *
  1027. FROM foo
  1028. ORDER BY a, b
  1029. OFFSET null;
  1030. # Prepared statement parameter in OFFSET inside a subquery
  1031. statement ok
  1032. PREPARE p2 AS
  1033. SELECT
  1034. (SELECT sum(a) FROM (
  1035. SELECT a
  1036. FROM foo
  1037. ORDER BY a, b
  1038. OFFSET $1
  1039. ))
  1040. FROM foo AS outer_foo
  1041. OFFSET $2;
  1042. query I
  1043. EXECUTE p2(0, 0);
  1044. ----
  1045. 3
  1046. 3
  1047. 3
  1048. query I
  1049. EXECUTE p2(2, 0);
  1050. ----
  1051. 2
  1052. 2
  1053. 2
  1054. query I
  1055. EXECUTE p2(0, 1);
  1056. ----
  1057. 3
  1058. 3
  1059. query I
  1060. EXECUTE p2(2, 1);
  1061. ----
  1062. 2
  1063. 2
  1064. statement ok
  1065. PREPARE p3 AS
  1066. SELECT *
  1067. FROM foo
  1068. ORDER BY a, b
  1069. OFFSET $1 - 2;
  1070. query error db error: ERROR: Invalid OFFSET clause: must not be negative, got \-2
  1071. EXECUTE p3(0);
  1072. query II
  1073. EXECUTE p3(2);
  1074. ----
  1075. 0 0
  1076. 1 0
  1077. 2 0
  1078. query II
  1079. EXECUTE p3(3);
  1080. ----
  1081. 1 0
  1082. 2 0
  1083. # This needs a cast to be auto-inserted from Int32 to Int64
  1084. query IT
  1085. EXECUTE p1(1);
  1086. ----
  1087. 1 one
  1088. 2 two
  1089. # The cast has CastContext::Assignment, so even Numeric -> Int64 is allowed.
  1090. query IT
  1091. EXECUTE p1(0.4);
  1092. ----
  1093. 0 zero
  1094. 1 one
  1095. 2 two
  1096. query IT
  1097. EXECUTE p1(0.6);
  1098. ----
  1099. 1 one
  1100. 2 two
  1101. # But text -> bigint is not allowed even in CastContext::Assignment.
  1102. query error db error: ERROR: unable to cast given parameter \$1: expected bigint, got text
  1103. EXECUTE p1('aaa');
  1104. query error db error: ERROR: Invalid OFFSET clause: must not be negative, got \-7
  1105. PREPARE p_error AS
  1106. SELECT *
  1107. FROM foo
  1108. ORDER BY a, b
  1109. OFFSET -7;
  1110. query error db error: ERROR: Invalid OFFSET clause: must not be negative, got \-2
  1111. PREPARE p_error AS
  1112. SELECT *
  1113. FROM foo
  1114. ORDER BY a, b
  1115. OFFSET 5-7;
  1116. query error db error: ERROR: Invalid OFFSET clause: invalid input syntax for type bigint: invalid digit found in string: "aaa"
  1117. PREPARE p_error AS
  1118. SELECT *
  1119. FROM foo
  1120. ORDER BY a, b
  1121. OFFSET 'aaa';
  1122. query error db error: ERROR: column "a" does not exist
  1123. PREPARE p_error AS
  1124. SELECT *
  1125. FROM foo
  1126. ORDER BY a, b
  1127. OFFSET a;
  1128. query error db error: ERROR: Invalid OFFSET clause: must be simplifiable to a constant, possibly after parameter binding, got integer_to_bigint\(#\^0\{a\}\)
  1129. PREPARE p_error AS
  1130. SELECT
  1131. (
  1132. SELECT *
  1133. FROM foo
  1134. ORDER BY a, b
  1135. OFFSET outer_foo.a
  1136. )
  1137. FROM foo AS outer_foo;
  1138. query error db error: ERROR: Expected subselect to return 1 column, got 2 columns
  1139. PREPARE p_error AS
  1140. SELECT
  1141. (
  1142. SELECT *
  1143. FROM foo
  1144. ORDER BY a, b
  1145. OFFSET outer_foo.a + $1
  1146. )
  1147. FROM foo AS outer_foo;
  1148. # It would be nice to error this out already in the PREPARE, but we currently error out only when executing this.
  1149. statement ok
  1150. PREPARE p_error_1 AS
  1151. SELECT
  1152. (
  1153. SELECT b
  1154. FROM foo
  1155. ORDER BY a, b
  1156. OFFSET outer_foo.a + $1
  1157. )
  1158. FROM foo AS outer_foo;
  1159. # This tests the `plan_select_inner`'s `try_visit_mut_pre` just after binding the parameters of `expr`.
  1160. query error db error: ERROR: Invalid OFFSET clause: Expected a constant expression, got integer_to_bigint\(\(#\^0\{a\} \+ 7\)\)
  1161. EXECUTE p_error_1(7);
  1162. query error db error: ERROR: OFFSET does not allow subqueries
  1163. PREPARE p_error AS
  1164. SELECT *
  1165. FROM foo
  1166. ORDER BY b, a
  1167. OFFSET (SELECT 2);
  1168. query error db error: ERROR: window functions are not allowed in OFFSET \(function pg_catalog\.lag\)
  1169. PREPARE p_error AS
  1170. SELECT *
  1171. FROM foo
  1172. ORDER BY b, a
  1173. OFFSET lag(5) OVER ();
  1174. query error db error: ERROR: window functions are not allowed in OFFSET \(function pg_catalog\.lag\)
  1175. PREPARE p_error AS
  1176. SELECT
  1177. (
  1178. SELECT a
  1179. FROM foo
  1180. ORDER BY a, b
  1181. OFFSET lag(5) OVER ()
  1182. )
  1183. FROM foo AS outer_foo;
  1184. # Unmaterializable function calls are not allowed (not deemed a constant by `HirScalarExpr::is_constant`, and then
  1185. # not simplified by `MirScalarExpr::reduce`).
  1186. query error db error: ERROR: Invalid OFFSET clause: must be simplifiable to a constant, possibly after parameter binding, got text_to_bigint\(mz_timestamp_to_text\(mz_now\(\)\)\)
  1187. PREPARE p_error AS
  1188. SELECT *
  1189. FROM foo
  1190. ORDER BY b, a
  1191. OFFSET mz_now()::string::bigint;
  1192. # OFFSET with CREATE VIEW
  1193. statement ok
  1194. CREATE VIEW v1 AS
  1195. SELECT *
  1196. FROM foo
  1197. ORDER BY b, a
  1198. OFFSET 1;
  1199. query T
  1200. SELECT b || a
  1201. FROM v1
  1202. ----
  1203. two2
  1204. zero0
  1205. query T
  1206. SELECT b || a
  1207. FROM v1
  1208. OFFSET 1
  1209. ----
  1210. zero0
  1211. query T
  1212. SELECT b || a
  1213. FROM v1
  1214. OFFSET 2 - 1
  1215. ----
  1216. zero0
  1217. query error db error: ERROR: column "a" does not exist
  1218. CREATE VIEW err AS
  1219. SELECT *
  1220. FROM foo
  1221. ORDER BY b, a
  1222. OFFSET a;
  1223. query error db error: ERROR: Invalid OFFSET clause: invalid input syntax for type bigint: invalid digit found in string: "aaaaa"
  1224. CREATE VIEW err AS
  1225. SELECT *
  1226. FROM foo
  1227. ORDER BY b, a
  1228. OFFSET 'aaaaa';
  1229. query error db error: ERROR: Invalid OFFSET clause: Expected an expression that evaluates to a non\-null value, got null
  1230. CREATE VIEW err AS
  1231. SELECT *
  1232. FROM foo
  1233. ORDER BY b, a
  1234. OFFSET null;
  1235. query error db error: ERROR: Invalid OFFSET clause: must be simplifiable to a constant, possibly after parameter binding, got text_to_bigint\(mz_timestamp_to_text\(mz_now\(\)\)\)
  1236. CREATE VIEW err AS
  1237. SELECT *
  1238. FROM foo
  1239. ORDER BY b, a
  1240. OFFSET mz_now()::string::bigint;
  1241. statement ok
  1242. CREATE VIEW v2 AS
  1243. SELECT
  1244. (SELECT sum(a) FROM (
  1245. (SELECT a
  1246. FROM foo)
  1247. UNION
  1248. (SELECT a+1
  1249. FROM foo)
  1250. ORDER BY a, b
  1251. OFFSET 2
  1252. )) AS s
  1253. FROM foo AS outer_foo
  1254. OFFSET 1;
  1255. query IIR
  1256. SELECT sum(s), count(s), avg(s) FROM v2;
  1257. ----
  1258. 10 2 5
  1259. # OFFSET with CREATE MATERIALIZED VIEW
  1260. statement ok
  1261. CREATE MATERIALIZED VIEW mv1 AS
  1262. SELECT *
  1263. FROM foo
  1264. ORDER BY b, a
  1265. OFFSET 1;
  1266. query T
  1267. SELECT b || a
  1268. FROM mv1
  1269. ----
  1270. two2
  1271. zero0
  1272. query T
  1273. SELECT b || a
  1274. FROM mv1
  1275. OFFSET 1
  1276. ----
  1277. zero0
  1278. query T
  1279. SELECT b || a
  1280. FROM mv1
  1281. OFFSET 2 - 1
  1282. ----
  1283. zero0
  1284. query error db error: ERROR: column "a" does not exist
  1285. CREATE MATERIALIZED VIEW err AS
  1286. SELECT *
  1287. FROM foo
  1288. ORDER BY b, a
  1289. OFFSET a;
  1290. query error db error: ERROR: Invalid OFFSET clause: invalid input syntax for type bigint: invalid digit found in string: "aaaaa"
  1291. CREATE MATERIALIZED VIEW err AS
  1292. SELECT *
  1293. FROM foo
  1294. ORDER BY b, a
  1295. OFFSET 'aaaaa';
  1296. query error db error: ERROR: Invalid OFFSET clause: Expected an expression that evaluates to a non\-null value, got null
  1297. CREATE MATERIALIZED VIEW err AS
  1298. SELECT *
  1299. FROM foo
  1300. ORDER BY b, a
  1301. OFFSET null;
  1302. query error db error: ERROR: Invalid OFFSET clause: must be simplifiable to a constant, possibly after parameter binding, got text_to_bigint\(mz_timestamp_to_text\(mz_now\(\)\)\)
  1303. CREATE MATERIALIZED VIEW err AS
  1304. SELECT *
  1305. FROM foo
  1306. ORDER BY b, a
  1307. OFFSET mz_now()::string::bigint;
  1308. statement ok
  1309. CREATE MATERIALIZED VIEW mv2 AS
  1310. SELECT
  1311. (SELECT sum(a) FROM (
  1312. (SELECT a
  1313. FROM foo)
  1314. UNION
  1315. (SELECT a+1
  1316. FROM foo)
  1317. ORDER BY a, b
  1318. OFFSET 2
  1319. )) AS s
  1320. FROM foo AS outer_foo
  1321. OFFSET 1;
  1322. query IIR
  1323. SELECT sum(s), count(s), avg(s) FROM mv2;
  1324. ----
  1325. 10 2 5
  1326. # VALUES statement -- OFFSET with parameter
  1327. statement ok
  1328. PREPARE p4 AS
  1329. VALUES (0), (1), (2) OFFSET $1
  1330. query I
  1331. EXECUTE p4(1);
  1332. ----
  1333. 1
  1334. 2
  1335. statement ok
  1336. PREPARE p5 AS
  1337. VALUES (10), (11), (12) OFFSET $1 - 1
  1338. query I
  1339. EXECUTE p5(2);
  1340. ----
  1341. 11
  1342. 12
  1343. statement ok
  1344. PREPARE p6 AS
  1345. VALUES (10), (11), (12), ($2), ($3)
  1346. ORDER BY 1 DESC
  1347. OFFSET $1 - 1
  1348. query I
  1349. EXECUTE p6(2, 100, 200);
  1350. ----
  1351. 100
  1352. 12
  1353. 11
  1354. 10
  1355. # Prepared statement parameter in LIMIT
  1356. statement ok
  1357. PREPARE fizz_paginated AS
  1358. SELECT *
  1359. FROM fizz
  1360. ORDER BY a, b DESC
  1361. LIMIT $1
  1362. OFFSET $2
  1363. query IT
  1364. EXECUTE fizz_paginated(4::bigint, 0*4);
  1365. ----
  1366. 1735 two
  1367. 7584 twelve
  1368. 12345 two
  1369. 12345 three
  1370. query IT
  1371. EXECUTE fizz_paginated(4::bigint, 1*4);
  1372. ----
  1373. 12345 one
  1374. 21243 four
  1375. 21758 fourteen
  1376. 24223 four
  1377. query IT
  1378. EXECUTE fizz_paginated(4::bigint, 2*4);
  1379. ----
  1380. 25040 two
  1381. # TODO: LIMIT currently just tries to match a literal after parameter binding. It should also do constant folding,
  1382. # similarly to OFFSET.
  1383. query error db error: ERROR: Top\-level LIMIT must be a constant expression, got integer_to_bigint\(4\)
  1384. EXECUTE fizz_paginated(4, 2*4);