funcs.slt 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729
  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. query error DISTINCT specified, but now is not an aggregate function
  11. SELECT now(DISTINCT)
  12. query error DISTINCT specified, but round is not an aggregate function
  13. SELECT round(DISTINCT 1)
  14. # Test date_trunc()
  15. # TODO: PostgreSQL truncates trailing zeros from seconds, we do not.
  16. # This test should return: 2019-11-26 15:56:46.24115
  17. query T
  18. SELECT date_trunc('microseconds', TIMESTAMP '2019-11-26 15:56:46.241150')
  19. ----
  20. 2019-11-26 15:56:46.24115
  21. query T
  22. SELECT date_trunc('milliseconds', TIMESTAMP '2019-11-26 15:56:46.241150')
  23. ----
  24. 2019-11-26 15:56:46.241
  25. query T
  26. SELECT date_trunc('second', TIMESTAMP '2019-11-26 15:56:46.241150')
  27. ----
  28. 2019-11-26 15:56:46
  29. query T
  30. SELECT date_trunc('minute', TIMESTAMP '2019-11-26 15:56:46.241150')
  31. ----
  32. 2019-11-26 15:56:00
  33. query T
  34. SELECT date_trunc('hour', TIMESTAMP '2019-11-26 15:56:46.241150')
  35. ----
  36. 2019-11-26 15:00:00
  37. query T
  38. SELECT date_trunc('day', TIMESTAMP '2019-11-26 15:56:46.241150')
  39. ----
  40. 2019-11-26 00:00:00
  41. query T
  42. SELECT date_trunc('week', TIMESTAMP '2019-11-26 15:56:46.241150')
  43. ----
  44. 2019-11-25 00:00:00
  45. query T
  46. SELECT date_trunc('week', TIMESTAMP '2020-08-02 00:00:00')
  47. ----
  48. 2020-07-27 00:00:00
  49. query error timestamp out of range
  50. SELECT date_trunc('week', make_timestamp(-262143, 1, 1, 0, 0, 0))
  51. query T
  52. SELECT date_trunc('month', TIMESTAMP '2019-11-26 15:56:46.241150')
  53. ----
  54. 2019-11-01 00:00:00
  55. query T
  56. SELECT date_trunc('quarter', TIMESTAMP '2019-11-26 15:56:46.241150')
  57. ----
  58. 2019-10-01 00:00:00
  59. query T
  60. SELECT date_trunc('year', TIMESTAMP '2019-11-26 15:56:46.241150')
  61. ----
  62. 2019-01-01 00:00:00
  63. query T
  64. SELECT date_trunc('decade', TIMESTAMP '2019-11-26 15:56:46.241150')
  65. ----
  66. 2010-01-01 00:00:00
  67. # Expects the first year of the century, meaning 2001 instead of 2000.
  68. query T
  69. SELECT date_trunc('century', TIMESTAMP '2019-11-26 15:56:46.241150')
  70. ----
  71. 2001-01-01 00:00:00
  72. # Round down century correctly, meaning 2000 is rounded to 1901.
  73. query T
  74. SELECT date_trunc('century', TIMESTAMP '2000-11-26 15:56:46.241150')
  75. ----
  76. 1901-01-01 00:00:00
  77. # Expects the first year of the millennium, meaning 2001 instead of 2000.
  78. query T
  79. SELECT date_trunc('millennium', TIMESTAMP '2019-11-26 15:56:46.241150')
  80. ----
  81. 2001-01-01 00:00:00
  82. # Round down millennium correctly, meaning 2000 is rounded to 1001.
  83. query T
  84. SELECT date_trunc('millennium', TIMESTAMP '2000-11-26 15:56:46.241150')
  85. ----
  86. 1001-01-01 00:00:00
  87. # TODO: Currently we do not parse BC/AD and it's erroneously considered a named time zone, so INTERVAL is used.
  88. # Expects the decade to be rounded down for BC.
  89. query T
  90. SELECT date_trunc('decade', TIMESTAMP '0001-01-01 00:00:00.000000' - INTERVAL '2'YEAR)
  91. ----
  92. 0011-01-01 00:00:00 BC
  93. # Expects the century to be rounded down for BC.
  94. query T
  95. SELECT date_trunc('century', TIMESTAMP '0001-01-01 00:00:00.000000' - INTERVAL '1'SECOND)
  96. ----
  97. 0100-01-01 00:00:00 BC
  98. # Expects the millennium to be rounded down for BC.
  99. query T
  100. SELECT date_trunc('millennium', TIMESTAMP '0001-01-01 00:00:00.000000' - INTERVAL '1'SECOND)
  101. ----
  102. 1000-01-01 00:00:00 BC
  103. query error unit 'bad' not recognized
  104. SELECT date_trunc('bad', TIMESTAMP '2019-11-26 15:56:46.241150')
  105. query T
  106. SELECT date_trunc('minute', TIMESTAMPTZ '1999-12-31 16:16:01+02:30')
  107. ----
  108. 1999-12-31 13:46:00+00
  109. query T
  110. SELECT date_trunc('day', TIMESTAMPTZ '1999-12-31 16:16:01+02:30')
  111. ----
  112. 1999-12-31 00:00:00+00
  113. query error unit 'bad' not recognized
  114. SELECT date_trunc('bad', TIMESTAMPTZ '1999-12-31 16:16:01+02:30')
  115. statement ok
  116. CREATE TABLE date_trunc_fields (
  117. field text
  118. )
  119. statement ok
  120. INSERT INTO date_trunc_fields VALUES ('day'), ('DaY'), ('month'), ('MoNTH')
  121. query T rowsort
  122. SELECT date_trunc(field, TIMESTAMP '2019-11-26 15:56:46.241150') FROM date_trunc_fields
  123. ----
  124. 2019-11-26 00:00:00
  125. 2019-11-26 00:00:00
  126. 2019-11-01 00:00:00
  127. 2019-11-01 00:00:00
  128. statement ok
  129. INSERT INTO date_trunc_fields VALUES ('bad')
  130. query error unit 'bad' not recognized
  131. SELECT date_trunc(field, TIMESTAMP '2019-11-26 15:56:46.241150') FROM date_trunc_fields
  132. # date_trunc with interval
  133. query T
  134. SELECT date_trunc('microseconds', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  135. ----
  136. 1234 years 11 months 23 days 23:59:12.123457
  137. query T
  138. SELECT date_trunc('milliseconds', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  139. ----
  140. 1234 years 11 months 23 days 23:59:12.123
  141. query T
  142. SELECT date_trunc('milliseconds', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  143. ----
  144. 1234 years 11 months 23 days 23:59:12.123
  145. query T
  146. SELECT date_trunc('seconds', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  147. ----
  148. 1234 years 11 months 23 days 23:59:12
  149. query T
  150. SELECT date_trunc('minutes', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  151. ----
  152. 1234 years 11 months 23 days 23:59:00
  153. query T
  154. SELECT date_trunc('hours', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  155. ----
  156. 1234 years 11 months 23 days 23:00:00
  157. query T
  158. SELECT date_trunc('days', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  159. ----
  160. 1234 years 11 months 23 days
  161. query error unit 'weeks' not recognized
  162. SELECT date_trunc('weeks', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  163. query T
  164. SELECT date_trunc('months', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  165. ----
  166. 1234 years 11 months
  167. query T
  168. SELECT date_trunc('years', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  169. ----
  170. 1234 years
  171. query T
  172. SELECT date_trunc('decade', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  173. ----
  174. 1230 years
  175. query T
  176. SELECT date_trunc('millennium', INTERVAL '1234 years 11 months 23 days 23:59:12.123456789') AS t;
  177. ----
  178. 1000 years
  179. query T
  180. SELECT date_trunc('second', '2562047788:00:54.775807'::INTERVAL) AS t;
  181. ----
  182. 2562047788:00:54
  183. query T
  184. SELECT date_trunc('second', '-2562047788:00:54.775807'::INTERVAL) AS t;
  185. ----
  186. -2562047788:00:54
  187. mode standard
  188. statement ok
  189. CREATE TABLE date_trunc_timestamps (
  190. ts timestamp
  191. )
  192. query T multiline
  193. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT date_trunc('day', ts) FROM date_trunc_timestamps
  194. ----
  195. Explained Query:
  196. Project (#1) // { arity: 1 }
  197. Map (date_trunc_day_ts(#0{ts})) // { arity: 2 }
  198. ReadStorage materialize.public.date_trunc_timestamps // { arity: 1 }
  199. Source materialize.public.date_trunc_timestamps
  200. Target cluster: quickstart
  201. EOF
  202. query T multiline
  203. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT date_trunc(field, ts) FROM date_trunc_fields, date_trunc_timestamps
  204. ----
  205. Explained Query:
  206. Project (#2) // { arity: 1 }
  207. Map (date_truncts(#0{field}, #1{ts})) // { arity: 3 }
  208. CrossJoin type=differential // { arity: 2 }
  209. implementation
  210. %0:date_trunc_fields[×] » %1:date_trunc_timestamps[×]
  211. ArrangeBy keys=[[]] // { arity: 1 }
  212. ReadStorage materialize.public.date_trunc_fields // { arity: 1 }
  213. ArrangeBy keys=[[]] // { arity: 1 }
  214. ReadStorage materialize.public.date_trunc_timestamps // { arity: 1 }
  215. Source materialize.public.date_trunc_fields
  216. Source materialize.public.date_trunc_timestamps
  217. Target cluster: quickstart
  218. EOF
  219. mode cockroach
  220. query R
  221. SELECT floor(CAST (1.1 AS double precision))
  222. ----
  223. 1
  224. query R
  225. SELECT floor(CAST (1.1 AS float))
  226. ----
  227. 1
  228. query RRRRR
  229. SELECT floor(1.1), floor(1.111), floor(100.1), floor(100.11), floor(-4.1)
  230. ----
  231. 1 1 100 100 -5
  232. query R
  233. SELECT ceil(CAST (1.1 AS double precision))
  234. ----
  235. 2
  236. query R
  237. SELECT ceil(CAST (1.1 AS float))
  238. ----
  239. 2
  240. query RRRRR
  241. SELECT ceil(1.1), ceil(1.111), ceil(100.1), ceil(100.11), ceil(-4.1)
  242. ----
  243. 2 2 101 101 -4
  244. query RRRRR
  245. SELECT ceiling(1.1), ceiling(1.111), ceiling(100.1), ceiling(100.11), ceiling(-4.1)
  246. ----
  247. 2 2 101 101 -4
  248. # postgres converts ints to floats on floor/ceil
  249. query R
  250. SELECT floor(1)
  251. ----
  252. 1
  253. query R
  254. SELECT floor(1)
  255. ----
  256. 1
  257. query R
  258. SELECT floor(cast(1 AS bigint))
  259. ----
  260. 1
  261. query R
  262. SELECT ceil(cast(1 AS bigint))
  263. ----
  264. 1
  265. query R
  266. SELECT floor(NULL)
  267. ----
  268. NULL
  269. query R
  270. SELECT ceil(NULL)
  271. ----
  272. NULL
  273. statement ok
  274. CREATE TABLE null_test (
  275. decimal_col decimal(14, 2),
  276. float_col float
  277. )
  278. statement ok
  279. INSERT INTO null_test VALUES (5.06, -1.59), (-12.58, NULL), (2.96, 2.2), (NULL, 23.8), (-9.4, -48.2)
  280. query RR rowsort
  281. SELECT floor(decimal_col), floor(float_col) FROM null_test
  282. ----
  283. -10 -49
  284. -13 NULL
  285. 2 2
  286. 5 -2
  287. NULL 23
  288. query RR rowsort
  289. SELECT ceil(decimal_col), ceil(float_col) FROM null_test
  290. ----
  291. -12 NULL
  292. -9 -48
  293. 3 3
  294. 6 -1
  295. NULL 24
  296. # Tests for the sqrt function.
  297. #
  298. # The implementation of sqrt delegates to {f32,f64}::sqrt, so these tests are
  299. # not particularly extensive.
  300. query error cannot take square root of a negative number
  301. SELECT sqrt(-1::float)
  302. query error cannot take square root of a negative number
  303. SELECT sqrt(-1::double precision)
  304. query error cannot take square root of a negative number
  305. SELECT sqrt(-1::decimal(15, 2))
  306. query R
  307. SELECT sqrt(1.23783::float)
  308. ----
  309. 1.112578087147145
  310. query R
  311. SELECT sqrt(1.23783::double)
  312. ----
  313. 1.112578087147145
  314. query R
  315. SELECT sqrt(1.23783::decimal(15, 5))
  316. ----
  317. 1.11257808714714492169319004932905215867
  318. # Test cbrt.
  319. query R
  320. SELECT cbrt(NULL)
  321. ----
  322. NULL
  323. query R
  324. SELECT cbrt(1.23783::float)::float4
  325. ----
  326. 1.07371
  327. query R
  328. SELECT cbrt(1.23783::double)::float4
  329. ----
  330. 1.07371
  331. query R
  332. SELECT cbrt(1.23783::decimal(15,5))::float4
  333. ----
  334. 1.07371
  335. query R
  336. SELECT cbrt(-8::double)::float4
  337. ----
  338. -2
  339. query R
  340. SELECT cbrt(3::int)::float4
  341. ----
  342. 1.4422495
  343. query R
  344. SELECT cbrt(27::int)::float4
  345. ----
  346. 3
  347. # Test coalesce.
  348. query I
  349. SELECT coalesce(NULL, 1, NULL)
  350. ----
  351. 1
  352. query R
  353. SELECT coalesce(NULL, 1, NULL)
  354. ----
  355. 1
  356. query T
  357. SELECT coalesce('hello', 'world', NULL)
  358. ----
  359. hello
  360. query T
  361. SELECT coalesce(row(5), row(10))
  362. ----
  363. (5)
  364. query T
  365. SELECT coalesce(row(4, 3), row(2, 1))
  366. ----
  367. (4,3)
  368. query T
  369. select coalesce(null::char(1), 'abc');
  370. ----
  371. abc
  372. query T
  373. SELECT coalesce('abc', null::char(1));
  374. ----
  375. abc
  376. query T
  377. SELECT coalesce(null::char(1),'abcde','abc');
  378. ----
  379. abcde
  380. query T
  381. SELECT coalesce('abcde',null::char(1),'abc');
  382. ----
  383. abcde
  384. # TODO(database-issues#3339)
  385. query error coalesce could not convert type record
  386. SELECT coalesce(row(1, 2), row(3), row(4, 5));
  387. statement ok
  388. CREATE TYPE custom_composite AS (i int);
  389. query T
  390. SELECT coalesce(row(1), row(1)::custom_composite)
  391. ----
  392. (1)
  393. statement ok
  394. CREATE VIEW v AS SELECT 1 AS a
  395. # Coalesce should reduce away errors that statically can be shown not to occur.
  396. query T
  397. SELECT coalesce(1, 1 / 0, a) FROM v
  398. ----
  399. 1
  400. query T
  401. select coalesce(null::char(1), 'abc');
  402. ----
  403. abc
  404. query T
  405. SELECT coalesce('abc', null::char(1));
  406. ----
  407. abc
  408. query T
  409. SELECT coalesce(null::char(1),'abcde','abc');
  410. ----
  411. abcde
  412. query T
  413. SELECT coalesce('abcde',null::char(1),'abc');
  414. ----
  415. abcde
  416. # Test greatest.
  417. query I
  418. SELECT greatest(1)
  419. ----
  420. 1
  421. query I
  422. SELECT greatest(1, 2)
  423. ----
  424. 2
  425. query I
  426. SELECT greatest(3, 1)
  427. ----
  428. 3
  429. query I
  430. SELECT greatest(NULL)
  431. ----
  432. NULL
  433. query I
  434. SELECT greatest(1, NULL, -1)
  435. ----
  436. 1
  437. query T
  438. SELECT greatest((3), (0), (-1));
  439. ----
  440. 3
  441. query T
  442. SELECT greatest(row(4, 3), row(4, 2), row(4, 4));
  443. ----
  444. (4,4)
  445. query T
  446. SELECT greatest(row(2, 3), row(1, 4), row(5, 0));
  447. ----
  448. (5,0)
  449. query T
  450. SELECT greatest(row(row(2, 4), 5), row(row(0, 10), 10), row(row(4, 3), 4));
  451. ----
  452. ("(4,3)",4)
  453. # TODO(database-issues#3339)
  454. query error greatest could not convert type record
  455. SELECT greatest(row(1, 2), row(3), row(4, 5));
  456. query T
  457. SELECT greatest(row(1), row(1)::custom_composite)
  458. ----
  459. (1)
  460. query error greatest could not convert type record\(f1: integer,f2: integer\) to text
  461. SELECT greatest(row(1, 2), 'hello');
  462. query error greatest types integer and text cannot be matched
  463. SELECT greatest(1::int, 2::text)
  464. # Test least.
  465. query I
  466. SELECT least(1)
  467. ----
  468. 1
  469. query I
  470. SELECT least(1, 2)
  471. ----
  472. 1
  473. query I
  474. SELECT least(3, 1)
  475. ----
  476. 1
  477. query I
  478. SELECT least(NULL)
  479. ----
  480. NULL
  481. query I
  482. SELECT least(1, NULL, -1)
  483. ----
  484. -1
  485. query T
  486. SELECT least((3), (0), (-1));
  487. ----
  488. -1
  489. query T
  490. SELECT least(row(4, 3), row(4, 2), row(4, 4));
  491. ----
  492. (4,2)
  493. query T
  494. SELECT least(row(2, 3), row(1, 4), row(5, 0));
  495. ----
  496. (1,4)
  497. query T
  498. SELECT least(row(row(2, 4), 5), row(row(0, 10), 10), row(row(4, 3), 4));
  499. ----
  500. ("(0,10)",10)
  501. # TODO(database-issues#3339)
  502. query error least could not convert type record
  503. SELECT least(row(1, 2), row(3), row(4, 5));
  504. query error least could not convert type record\(f1: integer,f2: integer\) to text
  505. SELECT least(row(1, 2), 'hello');
  506. query T
  507. SELECT least(row(1), row(1)::custom_composite)
  508. ----
  509. (1)
  510. query error least types integer and text cannot be matched
  511. SELECT least(1::int, 2::text)
  512. # Tests issue database-issues#827, that type information for Maps are correctly constructed
  513. # before being passed to expressions for optimization.
  514. statement ok
  515. CREATE VIEW bytes AS SELECT null::bytea AS data
  516. query T
  517. SELECT
  518. COALESCE(data::jsonb->>'field1', data::jsonb->>'field2')
  519. FROM (
  520. SELECT CONVERT_FROM(data, 'utf8') AS data FROM bytes
  521. )
  522. ----
  523. NULL
  524. query T
  525. SELECT trim(LEADING 'xy' FROM 'yxytrimyxy');
  526. ----
  527. trimyxy
  528. query T
  529. SELECT ltrim('yxytrimyxy', 'xy');
  530. ----
  531. trimyxy
  532. query T
  533. SELECT rtrim('yxytrimyxy', 'xy');
  534. ----
  535. yxytrim
  536. query T
  537. SELECT btrim('yxytrimyxy', 'xy');
  538. ----
  539. trim
  540. query T
  541. SELECT btrim(' yxytrimyxy ');
  542. ----
  543. yxytrimyxy
  544. query T
  545. SELECT rtrim('yxytrimyxy ');
  546. ----
  547. yxytrimyxy
  548. query T
  549. SELECT ltrim(' yxytrimyxy');
  550. ----
  551. yxytrimyxy
  552. query T
  553. SELECT trim('xy' FROM 'yxytrimyxy');
  554. ----
  555. trim
  556. query T
  557. SELECT trim(BOTH 'xy' FROM 'yxytrimyxy');
  558. ----
  559. trim
  560. query T
  561. SELECT trim(TRAILING FROM 'yxytrimyxy ');
  562. ----
  563. yxytrimyxy
  564. query T
  565. SELECT trim(FROM ' yxytrimyxy ');
  566. ----
  567. yxytrimyxy
  568. query T
  569. SELECT trim(BOTH FROM ' yxytrimyxy ');
  570. ----
  571. yxytrimyxy
  572. query T
  573. SELECT trim(' yxytrimyxy ');
  574. ----
  575. yxytrimyxy
  576. query T
  577. SELECT trim(BOTH ' yxytrimyxy ');
  578. ----
  579. yxytrimyxy
  580. query T
  581. SELECT trim(LEADING ' yxytrimyxy');
  582. ----
  583. yxytrimyxy
  584. statement error
  585. SELECT trim('c' 'ccccdogcc');
  586. # Test IS NULL reduction.
  587. mode standard
  588. statement ok
  589. CREATE TABLE t (
  590. a int,
  591. b int NOT NULL
  592. )
  593. query T multiline
  594. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT a IS NULL FROM t
  595. ----
  596. Explained Query:
  597. Project (#2) // { arity: 1 }
  598. Map ((#0{a}) IS NULL) // { arity: 3 }
  599. ReadStorage materialize.public.t // { arity: 2 }
  600. Source materialize.public.t
  601. Target cluster: quickstart
  602. EOF
  603. query T multiline
  604. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT a + a + a + a + a IS NULL FROM t
  605. ----
  606. Explained Query:
  607. Project (#2) // { arity: 1 }
  608. Map ((#0{a}) IS NULL) // { arity: 3 }
  609. ReadStorage materialize.public.t // { arity: 2 }
  610. Source materialize.public.t
  611. Target cluster: quickstart
  612. EOF
  613. query T multiline
  614. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT a + b IS NULL FROM t
  615. ----
  616. Explained Query:
  617. Project (#2) // { arity: 1 }
  618. Map ((#0{a}) IS NULL) // { arity: 3 }
  619. ReadStorage materialize.public.t // { arity: 2 }
  620. Source materialize.public.t
  621. Target cluster: quickstart
  622. EOF
  623. # Ensure that (a AND b) IS NULL is *not* reduced, as it is not as simple as
  624. # rewriting (A IS NULL) OR (b IS NULL). There are probably rewrite rules that
  625. # exist, but we do not support them yet. Similarly for OR.
  626. query T multiline
  627. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT (a::bool AND b::bool) IS NULL FROM t
  628. ----
  629. Explained Query:
  630. Project (#2) // { arity: 1 }
  631. Map (((integer_to_boolean(#0{a}) AND integer_to_boolean(#1{b}))) IS NULL) // { arity: 3 }
  632. ReadStorage materialize.public.t // { arity: 2 }
  633. Source materialize.public.t
  634. Target cluster: quickstart
  635. EOF
  636. mode cockroach
  637. # Test qualified function names.
  638. query I
  639. SELECT abs(-1)
  640. ----
  641. 1
  642. query I
  643. SELECT pg_catalog.abs(1)
  644. ----
  645. 1
  646. query I
  647. SELECT materialize.pg_catalog.abs(1)
  648. ----
  649. 1
  650. query error db error: ERROR: function "mz_catalog\.abs" does not exist
  651. SELECT mz_catalog.abs(1)
  652. query error unknown database 'noexist'
  653. SELECT noexist.pg_catalog.abs(1)
  654. # mod is a special case for qualified function names, since it is transformed
  655. # away by an early pass in the planner.
  656. query I
  657. SELECT mod(7, 4)
  658. ----
  659. 3
  660. query I
  661. SELECT pg_catalog.mod(7, 4)
  662. ----
  663. 3
  664. query error db error: ERROR: function "mz_catalog\.mod" does not exist
  665. SELECT mz_catalog.mod(7, 4)
  666. query error unknown database 'noexist'
  667. SELECT noexist.pg_catalog.mod(7, 4)
  668. query T
  669. SELECT pg_catalog.pg_encoding_to_char(6)
  670. ----
  671. UTF8
  672. query T
  673. SELECT pg_catalog.pg_encoding_to_char(7)
  674. ----
  675. NULL
  676. # The following tests are taken from cockroach/builtin_function.slt
  677. # todo@jldlaughlin: remove these duplicates
  678. query I
  679. SELECT array_lower(ARRAY['a', 'b'], 1)
  680. ----
  681. 1
  682. query I
  683. SELECT array_lower(ARRAY['a'], 1)
  684. ----
  685. 1
  686. query I
  687. SELECT array_lower(ARRAY['a'], 0)
  688. ----
  689. NULL
  690. query I
  691. SELECT array_lower(ARRAY['a'], 2)
  692. ----
  693. NULL
  694. query I
  695. SELECT array_lower(ARRAY[ARRAY[1, 2]], 2)
  696. ----
  697. 1
  698. query I
  699. SELECT array_upper(ARRAY['a', 'b'], 1)
  700. ----
  701. 2
  702. query I
  703. SELECT array_upper(ARRAY['a'], 1)
  704. ----
  705. 1
  706. query I
  707. SELECT array_upper(ARRAY['a'], 0)
  708. ----
  709. NULL
  710. query I
  711. SELECT array_upper(ARRAY['a'], 2)
  712. ----
  713. NULL
  714. query I
  715. SELECT array_upper(ARRAY[ARRAY[1, 2]], 2)
  716. ----
  717. 2
  718. # Additional array_lower, array_upper tests
  719. query I
  720. SELECT array_lower(ARRAY[[[9]]], 2)
  721. ----
  722. 1
  723. query I
  724. SELECT array_lower(ARRAY[[['a', 'b']]], 3)
  725. ----
  726. 1
  727. query I
  728. SELECT array_lower(ARRAY[[['a', 'b']]], 4)
  729. ----
  730. NULL
  731. query I
  732. SELECT array_upper(ARRAY[[[1, 2]]], 3)
  733. ----
  734. 2
  735. query I
  736. SELECT array_upper(ARRAY[[[1, 2]]], 4)
  737. ----
  738. NULL
  739. query I
  740. SELECT array_upper(ARRAY[NULL], 1)
  741. ----
  742. 1
  743. query I
  744. SELECT array_upper(ARRAY[1], NULL)
  745. ----
  746. NULL
  747. query I
  748. SELECT array_upper(NULL::text[], 1)
  749. ----
  750. NULL
  751. # TODO(fix)
  752. query error db error: ERROR: could not determine polymorphic type because input has type unknown
  753. SELECT array_upper(NULL, 1)
  754. query I
  755. SELECT array_length(ARRAY['a', 'b'], 1)
  756. ----
  757. 2
  758. query I
  759. SELECT array_length(ARRAY['a'], 1)
  760. ----
  761. 1
  762. query I
  763. SELECT array_length(ARRAY['a'], 0)
  764. ----
  765. NULL
  766. query I
  767. SELECT array_length(ARRAY['a'], 2)
  768. ----
  769. NULL
  770. query I
  771. SELECT array_length(ARRAY[ARRAY[1, 2]], 2)
  772. ----
  773. 2
  774. query I
  775. SELECT array_length(ARRAY[]::int[], 1)
  776. ----
  777. NULL
  778. query error could not determine polymorphic type because input has type unknown
  779. SELECT array_length(NULL, 1);
  780. # Test strange collapsing behavior of nested empty arrays. See database-issues#1709.
  781. query TIII
  782. SELECT arr, array_lower(arr, 1), array_upper(arr, 1), array_length(arr, 1) FROM
  783. (VALUES
  784. (ARRAY[]::int[]),
  785. (ARRAY[ARRAY[]]::int[]),
  786. (ARRAY[ARRAY[], ARRAY[], ARRAY[]]::int[]),
  787. (ARRAY[ARRAY[ARRAY[ARRAY[]]]]::int[])
  788. ) AS _ (arr)
  789. ----
  790. {} NULL NULL NULL
  791. {} NULL NULL NULL
  792. {} NULL NULL NULL
  793. {} NULL NULL NULL
  794. query error could not determine polymorphic type because input has type unknown
  795. SELECT array_upper(NULL, 1)
  796. query error could not determine polymorphic type because input has type unknown
  797. SELECT array_lower(NULL, 1)
  798. query T
  799. SELECT upper('a1Bd')
  800. ----
  801. A1BD
  802. query T
  803. SELECT upper('ALREADYUP')
  804. ----
  805. ALREADYUP
  806. query error db error: ERROR: function upper\(numeric\) does not exist
  807. SELECT upper(2.2)
  808. query T
  809. SELECT lower('a1Bd')
  810. ----
  811. a1bd
  812. query T
  813. SELECT lower('alreadylow')
  814. ----
  815. alreadylow
  816. query error db error: ERROR: function lower\(interval\) does not exist
  817. SELECT lower('1ms'::interval)
  818. # Test trigonometric functions.
  819. # Use standard mode to round floats to three digits of precision. This makes
  820. # tests more reliable across platforms, as platforms have different
  821. # implementations of the trigonometric functions that result in slight
  822. # variance in the least significant digits.
  823. mode standard
  824. query R
  825. SELECT sin(NULL)
  826. ----
  827. NULL
  828. query R
  829. SELECT sinh(NULL)
  830. ----
  831. NULL
  832. query R
  833. SELECT cos(NULL)
  834. ----
  835. NULL
  836. query R
  837. SELECT cosh(NULL)
  838. ----
  839. NULL
  840. query R
  841. SELECT tan(NULL)
  842. ----
  843. NULL
  844. query R
  845. SELECT tanh(NULL)
  846. ----
  847. NULL
  848. query R
  849. SELECT asin(NULL)
  850. ----
  851. NULL
  852. query R
  853. SELECT asinh(NULL)
  854. ----
  855. NULL
  856. query R
  857. SELECT acos(NULL)
  858. ----
  859. NULL
  860. query R
  861. SELECT acosh(NULL)
  862. ----
  863. NULL
  864. query R
  865. SELECT atan(NULL)
  866. ----
  867. NULL
  868. query R
  869. SELECT atanh(NULL)
  870. ----
  871. NULL
  872. query R
  873. SELECT cot(NULL)
  874. ----
  875. NULL
  876. query R
  877. SELECT sin('NaN'::double)
  878. ----
  879. NaN
  880. query R
  881. SELECT sinh('NaN'::double)
  882. ----
  883. NaN
  884. query R
  885. SELECT cos('NaN'::double)
  886. ----
  887. NaN
  888. query R
  889. SELECT cosh('NaN'::double)
  890. ----
  891. NaN
  892. query R
  893. SELECT tan('NaN'::double)
  894. ----
  895. NaN
  896. query R
  897. SELECT tanh('NaN'::double)
  898. ----
  899. NaN
  900. query R
  901. SELECT asin('NaN'::double)
  902. ----
  903. NaN
  904. query R
  905. SELECT asinh('NaN'::double)
  906. ----
  907. NaN
  908. query R
  909. SELECT acos('NaN'::double)
  910. ----
  911. NaN
  912. query R
  913. SELECT acosh('NaN'::double)
  914. ----
  915. NaN
  916. query R
  917. SELECT atan('NaN'::double)
  918. ----
  919. NaN
  920. query R
  921. SELECT atanh('NaN'::double)
  922. ----
  923. NaN
  924. query R
  925. SELECT cot('NaN'::double)
  926. ----
  927. NaN
  928. query R
  929. SELECT sin(0::double)
  930. ----
  931. 0.000
  932. query R
  933. SELECT sinh(0::double)
  934. ----
  935. 0.000
  936. query R
  937. SELECT cos(0::double)
  938. ----
  939. 1.000
  940. query R
  941. SELECT cosh(0::double)
  942. ----
  943. 1.000
  944. query R
  945. SELECT tan(0::double)
  946. ----
  947. 0.000
  948. query R
  949. SELECT tanh(0::double)
  950. ----
  951. 0.000
  952. query R
  953. SELECT asin(0::double)
  954. ----
  955. 0.000
  956. query R
  957. SELECT asinh(0::double)
  958. ----
  959. 0.000
  960. query R
  961. SELECT acos(0::double)
  962. ----
  963. 1.571
  964. query error function acosh is defined for numbers greater than or equal to 1
  965. SELECT acosh(0::double)
  966. query R
  967. SELECT atan(0::double)
  968. ----
  969. 0.000
  970. query R
  971. SELECT atanh(0::double)
  972. ----
  973. 0.000
  974. query R
  975. SELECT cot(0::double)
  976. ----
  977. inf
  978. query R
  979. SELECT cot(-0::double)
  980. ----
  981. -inf
  982. query R
  983. SELECT sin(1::double)
  984. ----
  985. 0.841
  986. query R
  987. SELECT sinh(1::double)
  988. ----
  989. 1.175
  990. query R
  991. SELECT cos(1::double)
  992. ----
  993. 0.540
  994. query R
  995. SELECT cosh(1::double)
  996. ----
  997. 1.543
  998. query R
  999. SELECT tan(1.01::double)
  1000. ----
  1001. 1.592
  1002. query R
  1003. SELECT tanh(1::double)
  1004. ----
  1005. 0.762
  1006. query R
  1007. SELECT asin(1::double)
  1008. ----
  1009. 1.571
  1010. query R
  1011. SELECT asinh(1::double)
  1012. ----
  1013. 0.881
  1014. query R
  1015. SELECT acos(1::double)
  1016. ----
  1017. 0.000
  1018. query R
  1019. SELECT acosh(1::double)
  1020. ----
  1021. 0.000
  1022. query R
  1023. SELECT atan(1::double)
  1024. ----
  1025. 0.785
  1026. query R
  1027. SELECT atanh(1::double)
  1028. ----
  1029. inf
  1030. query R
  1031. SELECT cot(1.01::double)
  1032. ----
  1033. 0.628
  1034. query error function sin is only defined for finite arguments
  1035. SELECT sin('inf'::double)
  1036. query error function asin is defined for numbers between -1 and 1 inclusive
  1037. SELECT asin('inf'::double)
  1038. query R
  1039. SELECT sinh('inf'::double)
  1040. ----
  1041. inf
  1042. query R
  1043. SELECT asinh('inf'::double)
  1044. ----
  1045. inf
  1046. query error function cos is only defined for finite arguments
  1047. SELECT cos('inf'::double)
  1048. query error function acos is defined for numbers between -1 and 1 inclusive
  1049. SELECT acos('inf'::double)
  1050. query R
  1051. SELECT cosh('inf'::double)
  1052. ----
  1053. inf
  1054. query R
  1055. SELECT acosh('inf'::double)
  1056. ----
  1057. inf
  1058. query error function tan is only defined for finite arguments
  1059. SELECT tan('inf'::double)
  1060. query R
  1061. SELECT atan('inf'::double)
  1062. ----
  1063. 1.571
  1064. query R
  1065. SELECT tanh('inf'::double)
  1066. ----
  1067. 1.000
  1068. query error function atanh is defined for numbers between -1 and 1 inclusive
  1069. SELECT atanh('inf'::double)
  1070. query error function cot is only defined for finite arguments
  1071. SELECT cot('inf'::double)
  1072. query error function sin is only defined for finite arguments
  1073. SELECT sin('-inf'::double)
  1074. query error function asin is defined for numbers between -1 and 1 inclusive
  1075. SELECT asin('-inf'::double)
  1076. query R
  1077. SELECT sinh('-inf'::double)
  1078. ----
  1079. -inf
  1080. query R
  1081. SELECT asinh('-inf'::double)
  1082. ----
  1083. -inf
  1084. query error function cos is only defined for finite arguments
  1085. SELECT cos('-inf'::double)
  1086. query error function acos is defined for numbers between -1 and 1 inclusive
  1087. SELECT acos('-inf'::double)
  1088. query R
  1089. SELECT cosh('-inf'::double)
  1090. ----
  1091. inf
  1092. query error function acosh is defined for numbers greater than or equal to 1
  1093. SELECT acosh('-inf'::double)
  1094. query error function tan is only defined for finite arguments
  1095. SELECT tan('-inf'::double)
  1096. query R
  1097. SELECT atan('-inf'::double)
  1098. ----
  1099. -1.571
  1100. query R
  1101. SELECT tanh('-inf'::double)
  1102. ----
  1103. -1.000
  1104. query error atanh is defined for numbers between -1 and 1 inclusive
  1105. SELECT atanh('-inf'::double)
  1106. # Use the more reasonable number representation, as the standard mode
  1107. # causes all sorts of weird representation issues with exp and log:
  1108. mode cockroach
  1109. query error function cot is only defined for finite arguments
  1110. SELECT cot('-inf'::double)
  1111. query error function log10 is not defined for zero
  1112. SELECT log10(0.0::double)
  1113. query error function log10 is not defined for zero
  1114. SELECT log10(+0.0::double)
  1115. query error function log10 is not defined for negative numbers
  1116. SELECT log10(-1.0::double)
  1117. query R
  1118. SELECT log10(10.0::double)
  1119. ----
  1120. 1
  1121. query R
  1122. SELECT log(10.0::decimal(15, 5))
  1123. ----
  1124. 1
  1125. query error function log is not defined for zero
  1126. SELECT log(0.0, 10)
  1127. query error function log is not defined for zero
  1128. SELECT log(+0.0, 10)
  1129. query error function log is not defined for negative numbers
  1130. SELECT log(-10, 10)
  1131. query error function log is not defined for zero
  1132. SELECT log(10, 0.0)
  1133. query error function log is not defined for zero
  1134. SELECT log(10, +0.0)
  1135. query error function log is not defined for negative numbers
  1136. SELECT log(10.0, -10)
  1137. query R
  1138. SELECT log(10, 10)
  1139. ----
  1140. 1
  1141. query R
  1142. SELECT log(400, 20)
  1143. ----
  1144. 0.500000000000000000000000000000000000001
  1145. query R
  1146. SELECT log10(10::decimal(15, 5))
  1147. ----
  1148. 1
  1149. query R
  1150. SELECT round(ln(13::float)::decimal(15, 5), 3)
  1151. ----
  1152. 2.565
  1153. query error function ln is not defined for negative numbers
  1154. SELECT ln(-1)
  1155. query error function ln is not defined for zero
  1156. SELECT ln(0)
  1157. query R
  1158. SELECT ln(13.0000::decimal(15, 5))
  1159. ----
  1160. 2.56494935746153673605348744156531860481
  1161. query R
  1162. SELECT round(exp(2)::decimal(15, 5), 3)
  1163. ----
  1164. 7.389
  1165. query R
  1166. SELECT exp(ln(2))
  1167. ----
  1168. 2
  1169. query T
  1170. SELECT exp(ln(2::decimal(15, 5)))
  1171. ----
  1172. 2
  1173. query error value out of range: overflow
  1174. SELECT exp(10000::float)
  1175. query error value out of range: underflow
  1176. SELECT exp(-10000::float)
  1177. query R
  1178. SELECT power(382, 5);
  1179. ----
  1180. 8134236862432
  1181. query T
  1182. SELECT power(9::float, 0.5);
  1183. ----
  1184. 3.000
  1185. query T
  1186. SELECT power(9::decimal(15, 5), 0.5::decimal(15, 5));
  1187. ----
  1188. 3
  1189. query error zero raised to a negative power is undefined
  1190. SELECT power(0::float, -1);
  1191. query error function pow cannot return complex numbers
  1192. SELECT power(-2.0::float, 1.5)
  1193. query R
  1194. SELECT pow(382, 5);
  1195. ----
  1196. 8134236862432
  1197. query T
  1198. SELECT pow(9::float, 0.5);
  1199. ----
  1200. 3.000
  1201. query T
  1202. SELECT pow(9::decimal(15, 5), 0.5::decimal(15, 5));
  1203. ----
  1204. 3
  1205. query error value out of range: overflow
  1206. SELECT pow(3::float, 10000)
  1207. query T
  1208. SELECT pow(0::float, 10000)
  1209. ----
  1210. 0.000
  1211. query error value out of range: underflow
  1212. SELECT pow(3::float, -10000)
  1213. query T
  1214. SELECT pg_column_size(NULL)
  1215. ----
  1216. NULL
  1217. query IIII
  1218. SELECT pg_column_size(1::int4), pg_column_size(2::int8), pg_column_size('a'), pg_column_size('ab')
  1219. ----
  1220. 2 2 3 4
  1221. query I
  1222. SELECT pg_column_size((1, 2))
  1223. ----
  1224. 13
  1225. statement ok
  1226. CREATE TABLE col_size (a INT, b INT, c TEXT)
  1227. statement ok
  1228. INSERT INTO col_size VALUES (1, 2, 'some string longer than 32 chars.'), (NULL, NULL, NULL)
  1229. query IIIIII
  1230. SELECT a, b, pg_column_size(col_size.*), pg_column_size(col_size.a), pg_column_size(col_size.b), pg_column_size(col_size.c) FROM col_size ORDER BY a
  1231. ----
  1232. 1 2 48 2 2 35
  1233. NULL NULL 12 NULL NULL NULL
  1234. statement error mz_row_size requires a record type
  1235. SELECT mz_row_size(NULL)
  1236. ----
  1237. NULL
  1238. statement error mz_row_size requires a record type
  1239. SELECT mz_row_size(1)
  1240. ----
  1241. NULL
  1242. query III
  1243. SELECT mz_row_size((1, 2)), mz_row_size((1, 2, 3, 4)), mz_row_size((1, 2, 3, 4, 5))
  1244. ----
  1245. 24 24 24
  1246. statement ok
  1247. CREATE TABLE ts_size (t TEXT)
  1248. statement ok
  1249. INSERT INTO ts_size VALUES ('2023-10-30T13:47:11Z')
  1250. query I
  1251. SELECT mz_row_size(ts_size.*) FROM ts_size
  1252. ----
  1253. 24
  1254. query III
  1255. SELECT a, b, mz_row_size(col_size.*) FROM col_size ORDER BY a
  1256. ----
  1257. 1 2 63
  1258. NULL NULL 24
  1259. query error mz_errored
  1260. SELECT mz_unsafe.mz_error_if_null(NULL, 'mz_errored')
  1261. query I
  1262. SELECT mz_unsafe.mz_error_if_null(1, '')
  1263. ----
  1264. 1
  1265. # Confirm that `mz_error_if_null` can be seen to be non-null.
  1266. query T multiline
  1267. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT mz_unsafe.mz_error_if_null(t, '') IS NULL FROM ts_size;
  1268. ----
  1269. Explained Query:
  1270. Project (#1)
  1271. Map (false)
  1272. ReadStorage materialize.public.ts_size
  1273. Source materialize.public.ts_size
  1274. Target cluster: quickstart
  1275. EOF
  1276. query error unexpected NULL
  1277. SELECT mz_unsafe.mz_error_if_null(NULL, NULL)
  1278. query B
  1279. SELECT pg_backend_pid() > 0
  1280. ----
  1281. true
  1282. query B
  1283. SELECT pg_is_in_recovery()
  1284. ----
  1285. false
  1286. query B
  1287. SELECT pg_tablespace_location(0) IS NULL
  1288. ----
  1289. true
  1290. query B
  1291. SELECT pg_get_ruledef(0) IS NULL
  1292. ----
  1293. true
  1294. query I
  1295. SELECT pg_relation_size('pg_views'::regclass)
  1296. ----
  1297. -1
  1298. query I
  1299. SELECT pg_relation_size('pg_views'::regclass::oid)
  1300. ----
  1301. -1
  1302. query I
  1303. SELECT pg_relation_size('pg_views'::regclass, 'main')
  1304. ----
  1305. -1
  1306. query I
  1307. SELECT pg_relation_size('pg_views'::regclass::oid, 'main')
  1308. ----
  1309. -1
  1310. query I
  1311. SELECT pg_stat_get_numscans('pg_views'::regclass::oid)
  1312. ----
  1313. -1
  1314. # mz_unsafe functions can't be executed with the enable_unsafe_functions flag turned off
  1315. simple conn=mz_system,user=mz_system
  1316. ALTER SYSTEM SET unsafe_enable_unsafe_functions = false
  1317. ----
  1318. COMPLETE 0
  1319. statement error executing potentially dangerous functions is not supported
  1320. SELECT mz_unsafe.mz_sleep(10)
  1321. statement error executing potentially dangerous functions is not supported
  1322. SELECT mz_unsafe.mz_panic('hello')
  1323. statement ok
  1324. SELECT mz_internal.is_rbac_enabled()
  1325. statement ok
  1326. CREATE TABLE dangerous_table (a INT, b TEXT)
  1327. statement ok
  1328. INSERT INTO dangerous_table (a) VALUES (1)
  1329. statement error executing potentially dangerous functions is not supported
  1330. SELECT mz_unsafe.mz_any(a) FROM dangerous_table
  1331. statement error executing potentially dangerous functions is not supported
  1332. INSERT INTO dangerous_table (b) VALUES (mz_unsafe.mz_panic('hello'))
  1333. statement ok
  1334. DROP TABLE dangerous_table
  1335. statement ok
  1336. SELECT * FROM mz_internal.mz_resolve_object_name('regclass', 't');
  1337. statement ok
  1338. SELECT mz_internal.mz_resolve_object_name('regclass', 't');
  1339. simple conn=mz_system,user=mz_system
  1340. ALTER SYSTEM SET unsafe_enable_unsafe_functions = true
  1341. ----
  1342. COMPLETE 0
  1343. query error function textrecv\(\) does not exist
  1344. SELECT textrecv()
  1345. query error cannot call function with arguments of type internal
  1346. SELECT textrecv('abc')