parse_ident.slt 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  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. #
  10. # The original source code is subject to the terms of the PostgreSQL license, a copy
  11. # of which can be found in the LICENSE file at the root of this repository.
  12. # transliterated from postgres/src/test/regress/sql/name.sql
  13. query T
  14. SELECT parse_ident('Schemax.Tabley')::text;
  15. ----
  16. {schemax,tabley}
  17. query T
  18. SELECT parse_ident('"SchemaX"."TableY"')::text;
  19. ----
  20. {SchemaX,TableY}
  21. query T
  22. SELECT parse_ident('foo.boo')::text;
  23. ----
  24. {foo,boo}
  25. query error string is not a valid identifier: "foo.boo\[\]"
  26. SELECT parse_ident('foo.boo[]');
  27. query T
  28. SELECT parse_ident('foo.boo[]', false)::text;
  29. ----
  30. {foo,boo}
  31. query error string is not a valid identifier: " "
  32. SELECT parse_ident(' ');
  33. query error string is not a valid identifier: " .aaa"
  34. SELECT parse_ident(' .aaa');
  35. query error string is not a valid identifier: " aaa . "
  36. SELECT parse_ident(' aaa . ');
  37. query error string is not a valid identifier: "aaa.a%b"
  38. SELECT parse_ident('aaa.a%b');
  39. query error string is not a valid identifier: "X\rXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  40. SELECT parse_ident(E'X\rXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
  41. query II
  42. SELECT length(parse_ident[1]), length(parse_ident[2])
  43. FROM
  44. (
  45. SELECT
  46. parse_ident(
  47. '"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
  48. )
  49. );
  50. ----
  51. 414
  52. 289
  53. query T
  54. SELECT parse_ident(' first . " second " ." third ". " ' || repeat('x',66) || '"')::text;
  55. ----
  56. {first," second "," third "," xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
  57. query error octal escapes are not supported
  58. SELECT parse_ident(E'"c".X XXXX\002XXXXXX');
  59. query error string is not a valid identifier: "1020"
  60. SELECT parse_ident('1020');
  61. query error string is not a valid identifier: "10.20"
  62. SELECT parse_ident('10.20');
  63. query error string is not a valid identifier: "."
  64. SELECT parse_ident('.');
  65. query error string is not a valid identifier: ".1020"
  66. SELECT parse_ident('.1020');
  67. query error string is not a valid identifier: "xxx.1020"
  68. SELECT parse_ident('xxx.1020');
  69. # Non-PG tests
  70. query error string is not a valid identifier: ""
  71. SELECT parse_ident('');
  72. query error string is not a valid identifier: "\$abc"
  73. SELECT parse_ident('$abc');
  74. query T
  75. SELECT parse_ident('"$abc"');
  76. ----
  77. {$abc}
  78. query error string is not a valid identifier: "abc\.\$def"
  79. SELECT parse_ident('abc.$def');
  80. query T
  81. SELECT parse_ident('abc."$def"');
  82. ----
  83. {abc,$def}
  84. query error string is not a valid identifier: "abc\.def \$"
  85. SELECT parse_ident('abc.def $');
  86. query T
  87. SELECT parse_ident('abc."def $"');
  88. ----
  89. {abc,"def $"}
  90. query T
  91. SELECT parse_ident('abc.def $', false);
  92. ----
  93. {abc,def}
  94. query T
  95. SELECT parse_ident('a$');
  96. ----
  97. {a$}
  98. query T
  99. SELECT parse_ident('abc.d$');
  100. ----
  101. {abc,d$}
  102. query T
  103. SELECT parse_ident('a$.d$');
  104. ----
  105. {a$,d$}
  106. query T
  107. SELECT parse_ident('🌍');
  108. ----
  109. {🌍}
  110. query T
  111. SELECT parse_ident('🌍.🌍');
  112. ----
  113. {🌍,🌍}
  114. query T
  115. SELECT parse_ident('🌍.abc');
  116. ----
  117. {🌍,abc}
  118. query T
  119. SELECT parse_ident('abc.🌍');
  120. ----
  121. {abc,🌍}
  122. query T
  123. SELECT parse_ident('"🌍"');
  124. ----
  125. {🌍}
  126. query T
  127. SELECT parse_ident('"🌍"."🌍"');
  128. ----
  129. {🌍,🌍}
  130. query T
  131. SELECT parse_ident('"🌍".abc');
  132. ----
  133. {🌍,abc}
  134. query T
  135. SELECT parse_ident('abc."🌍"');
  136. ----
  137. {abc,🌍}
  138. query T
  139. SELECT parse_ident(' 🌍 ');
  140. ----
  141. {🌍}
  142. query T
  143. SELECT parse_ident(' 🌍 . 🌍 ');
  144. ----
  145. {🌍,🌍}
  146. query T
  147. SELECT parse_ident('" 🌍 "." 🌍 "');
  148. ----
  149. {" 🌍 "," 🌍 "}
  150. query T
  151. SELECT parse_ident(' 🌍 .abc');
  152. ----
  153. {🌍,abc}
  154. query T
  155. SELECT parse_ident('abc. 🌍 ');
  156. ----
  157. {abc,🌍}
  158. query T
  159. SELECT parse_ident('a.b.c.d.e.f');
  160. ----
  161. {a,b,c,d,e,f}
  162. query error string is not a valid identifier: "a\\0b"
  163. SELECT parse_ident('a\0b');
  164. query T
  165. SELECT parse_ident('"a\0b"');
  166. ----
  167. {"a\\0b"}
  168. query error string is not a valid identifier: "a b"
  169. SELECT parse_ident('a b');
  170. query error string is not a valid identifier: "a\.b c"
  171. SELECT parse_ident('a.b c');
  172. simple
  173. SELECT parse_ident('a."b');
  174. ----
  175. db error: ERROR: string is not a valid identifier: "a.\"b"
  176. DETAIL: String has unclosed double quotes.
  177. statement ok
  178. CREATE TABLE t (c text);
  179. query T multiline
  180. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT parse_ident(c)::text FROM t;
  181. ----
  182. Explained Query:
  183. Project (#1)
  184. Map (arraytostr(parse_ident(#0{c}, true)))
  185. ReadStorage materialize.public.t
  186. Source materialize.public.t
  187. Target cluster: quickstart
  188. EOF
  189. # normalizing object names; this is largely built on top of parse_ident
  190. query T
  191. SELECT mz_internal.mz_normalize_object_name('Dbz.Schemax.Tabley')::text;
  192. ----
  193. {dbz,schemax,tabley}
  194. query T
  195. SELECT mz_internal.mz_normalize_object_name('"Dbz"."SchemaX"."TableY"')::text;
  196. ----
  197. {Dbz,SchemaX,TableY}
  198. query T
  199. SELECT mz_internal.mz_normalize_object_name('Schemax.Tabley')::text;
  200. ----
  201. {NULL,schemax,tabley}
  202. query T
  203. SELECT mz_internal.mz_normalize_object_name('"SchemaX"."TableY"')::text;
  204. ----
  205. {NULL,SchemaX,TableY}
  206. query error db error: ERROR: improper relation name \(too many dotted names\): Dbz\.Schemax\.Tabley\.Cola
  207. SELECT mz_internal.mz_normalize_object_name('Dbz.Schemax.Tabley.Cola')::text;
  208. query error db error: ERROR: improper relation name \(too many dotted names\): "Dbz"\."SchemaX"\."TableY"\.Cola
  209. SELECT mz_internal.mz_normalize_object_name('"Dbz"."SchemaX"."TableY".Cola')::text;
  210. query error string is not a valid identifier: ""
  211. SELECT mz_internal.mz_normalize_object_name('');
  212. query error string is not a valid identifier: " "
  213. SELECT mz_internal.mz_normalize_object_name(' ');
  214. query error string is not a valid identifier: "1020"
  215. SELECT mz_internal.mz_normalize_object_name('1020');
  216. query T
  217. SELECT mz_internal.mz_normalize_object_name('"$abc"');
  218. ----
  219. {NULL,NULL,$abc}
  220. query T
  221. SELECT mz_internal.mz_normalize_object_name('a$.d$');
  222. ----
  223. {NULL,a$,d$}
  224. query T
  225. SELECT mz_internal.mz_normalize_object_name('a$.b$.c$');
  226. ----
  227. {a$,b$,c$}
  228. query T
  229. SELECT mz_internal.mz_normalize_object_name('"🌍"');
  230. ----
  231. {NULL,NULL,🌍}
  232. query T
  233. SELECT mz_internal.mz_normalize_object_name('"🌍"."🌍"."🌍"');
  234. ----
  235. {🌍,🌍,🌍}
  236. query T
  237. SELECT mz_internal.mz_normalize_object_name('🌍.🌍.🌍');
  238. ----
  239. {🌍,🌍,🌍}
  240. query error db error: ERROR: improper relation name \(too many dotted names\): 🌍\.🌍\.🌍\.🌍
  241. SELECT mz_internal.mz_normalize_object_name('🌍.🌍.🌍.🌍');
  242. # normalizing schema names; this is largely built on top of parse_ident
  243. query T
  244. SELECT mz_internal.mz_normalize_schema_name('Dbz.Schemax')::text;
  245. ----
  246. {dbz,schemax}
  247. query T
  248. SELECT mz_internal.mz_normalize_schema_name('"Dbz"."SchemaX"')::text;
  249. ----
  250. {Dbz,SchemaX}
  251. query T
  252. SELECT mz_internal.mz_normalize_schema_name('Schemax')::text;
  253. ----
  254. {NULL,schemax}
  255. query T
  256. SELECT mz_internal.mz_normalize_schema_name('"SchemaX"')::text;
  257. ----
  258. {NULL,SchemaX}
  259. query error db error: ERROR: improper schema name \(too many dotted names\): Dbz\.Schemax\.Tabley
  260. SELECT mz_internal.mz_normalize_schema_name('Dbz.Schemax.Tabley')::text;
  261. query error db error: ERROR: improper schema name \(too many dotted names\): "Dbz"\."SchemaX"\."TableY"
  262. SELECT mz_internal.mz_normalize_schema_name('"Dbz"."SchemaX"."TableY"')::text;
  263. query error string is not a valid identifier: ""
  264. SELECT mz_internal.mz_normalize_schema_name('');
  265. query error string is not a valid identifier: " "
  266. SELECT mz_internal.mz_normalize_schema_name(' ');
  267. query error string is not a valid identifier: "1020"
  268. SELECT mz_internal.mz_normalize_schema_name('1020');
  269. query T
  270. SELECT mz_internal.mz_normalize_schema_name('"$abc"');
  271. ----
  272. {NULL,$abc}
  273. query T
  274. SELECT mz_internal.mz_normalize_schema_name('a$.d$');
  275. ----
  276. {a$,d$}
  277. query T
  278. SELECT mz_internal.mz_normalize_schema_name('"🌍"');
  279. ----
  280. {NULL,🌍}
  281. query T
  282. SELECT mz_internal.mz_normalize_schema_name('"🌍"."🌍"');
  283. ----
  284. {🌍,🌍}
  285. query T
  286. SELECT mz_internal.mz_normalize_schema_name('🌍.🌍');
  287. ----
  288. {🌍,🌍}
  289. query error db error: ERROR: improper schema name \(too many dotted names\): 🌍\.🌍\.🌍
  290. SELECT mz_internal.mz_normalize_schema_name('🌍.🌍.🌍');
  291. statement ok
  292. DROP TABLE IF EXISTS t;
  293. statement ok
  294. CREATE TABLE t (c text);
  295. query T multiline
  296. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT mz_internal.mz_normalize_object_name(c)::text FROM t;
  297. ----
  298. Explained Query:
  299. Project (#1)
  300. Map (arraytostr(case when (#0{c}) IS NULL then null else case when ((parse_ident(#0{c}, true) array_length 1) > 3) then error_if_null(null, ("improper relation name (too many dotted names): " || #0{c})) else (array_fill(null, array[(3 - (parse_ident(#0{c}, true) array_length 1))]) || parse_ident(#0{c}, true)) end end))
  301. ReadStorage materialize.public.t
  302. Source materialize.public.t
  303. Target cluster: quickstart
  304. EOF