rename.td 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906
  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. $ set-arg-default default-replica-size=1
  10. $ set-arg-default single-replica-cluster=quickstart
  11. $ set-regex match=u\d+|cluster1|quickstart|testdrive_single_replica_cluster|testdrive-data-\d+ replacement=<VARIABLE_OUTPUT>
  12. $ set writer-schema={
  13. "name": "row",
  14. "type": "record",
  15. "fields": [
  16. {"name": "a", "type": "long"},
  17. {"name": "b", "type": "string"}
  18. ]
  19. }
  20. $ kafka-create-topic topic=data
  21. $ kafka-ingest topic=data format=avro schema=${writer-schema}
  22. {"a": 1, "b": "dog"}
  23. # Create library of objects and verify names
  24. > CREATE CONNECTION kafka_conn
  25. TO KAFKA (BROKER '${testdrive.kafka-addr}', SECURITY PROTOCOL PLAINTEXT);
  26. > CREATE CONNECTION IF NOT EXISTS csr_conn TO CONFLUENT SCHEMA REGISTRY (
  27. URL '${testdrive.schema-registry-url}'
  28. );
  29. > CREATE SOURCE mz_data
  30. IN CLUSTER ${arg.single-replica-cluster}
  31. FROM KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-data-${testdrive.seed}')
  32. > CREATE TABLE mz_data_tbl FROM SOURCE mz_data (REFERENCE "testdrive-data-${testdrive.seed}")
  33. FORMAT AVRO USING SCHEMA '${writer-schema}'
  34. > CREATE DEFAULT INDEX ON mz_data_tbl
  35. > CREATE SINK sink1
  36. IN CLUSTER ${arg.single-replica-cluster}
  37. FROM mz_data_tbl
  38. INTO KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-snk1-${testdrive.seed}')
  39. FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY CONNECTION csr_conn
  40. ENVELOPE DEBEZIUM
  41. > CREATE VIEW mz_view AS
  42. SELECT * FROM mz_data_tbl
  43. > CREATE DEFAULT INDEX ON mz_view
  44. > SHOW INDEXES ON mz_view
  45. name on cluster key comment
  46. --------------------------------------------------------------------------------------------
  47. mz_view_primary_idx mz_view <VARIABLE_OUTPUT> {a,b} ""
  48. > CREATE VIEW dependent_view AS
  49. SELECT * FROM mz_view;
  50. > CREATE VIEW byzantine_view AS
  51. SELECT mz_data_tbl.a, mz_view.b FROM mz_data_tbl JOIN mz_view ON mz_data_tbl.a = mz_view.a;
  52. > CREATE VIEW oppositional_view AS
  53. SELECT * FROM mz_view WHERE b = '
  54. an adversarial string
  55. "materialize"."public"."mz_data_tbl"
  56. ';
  57. > CREATE VIEW public_objects AS
  58. SELECT mz_objects.id, mz_objects.oid, mz_objects.schema_id, mz_objects.name, mz_objects.type
  59. FROM mz_objects
  60. JOIN mz_schemas ON mz_objects.schema_id = mz_schemas.id
  61. WHERE mz_schemas.name = 'public';
  62. > SELECT name FROM public_objects WHERE name LIKE 'mz_data%';
  63. name
  64. -----
  65. mz_data
  66. mz_data_tbl
  67. mz_data_tbl_primary_idx
  68. mz_data_progress
  69. # Test that data can be selected from the source before renaming.
  70. > SELECT * FROM mz_data_tbl
  71. a b
  72. ------
  73. 1 dog
  74. ! ALTER VIEW mz_data RENAME TO renamed_mz_data;
  75. exact:mz_data is a source not a view
  76. ! ALTER INDEX mz_data RENAME TO renamed_mz_data;
  77. exact:mz_data is a source not an index
  78. > ALTER SOURCE mz_data RENAME TO renamed_mz_data;
  79. > SELECT name FROM public_objects WHERE name LIKE 'mz_data%';
  80. name
  81. -----
  82. mz_data_tbl_primary_idx
  83. mz_data_tbl
  84. mz_data_progress
  85. > ALTER TABLE mz_data_tbl RENAME TO renamed_mz_data_tbl;
  86. > SELECT name FROM public_objects WHERE name LIKE 'mz_data%';
  87. name
  88. -----
  89. mz_data_tbl_primary_idx
  90. mz_data_progress
  91. > SELECT name FROM public_objects WHERE name LIKE 'renamed_mz_data%';
  92. name
  93. -----
  94. renamed_mz_data
  95. renamed_mz_data_tbl
  96. # Test that data can be selected from the source after renaming.
  97. > SELECT * FROM renamed_mz_data_tbl
  98. a b
  99. ------
  100. 1 dog
  101. # Test that data can be selected from the source if it is rematerialized with
  102. # the new name. This previously tripped an assertion that asserted that a source
  103. # descriptor never changed; it is in fact okay for the name of a source to
  104. # change.
  105. > DROP INDEX mz_data_tbl_primary_idx
  106. > CREATE DEFAULT INDEX ON renamed_mz_data_tbl
  107. > SELECT * FROM renamed_mz_data_tbl
  108. a b
  109. ------
  110. 1 dog
  111. > SELECT name FROM public_objects WHERE name LIKE 'mz_view%';
  112. name
  113. -----
  114. mz_view
  115. mz_view_primary_idx
  116. ! ALTER SOURCE mz_view RENAME TO renamed_mz_view;
  117. exact:mz_view is a view not a source
  118. ! ALTER INDEX mz_view RENAME TO renamed_mz_view;
  119. exact:mz_view is a view not an index
  120. > ALTER VIEW mz_view RENAME TO renamed_mz_view;
  121. > SELECT name FROM public_objects WHERE name LIKE 'mz_view%';
  122. name
  123. -----
  124. mz_view_primary_idx
  125. > SELECT name FROM public_objects WHERE name LIKE 'renamed_mz_view%';
  126. name
  127. -----
  128. renamed_mz_view
  129. > SELECT name FROM public_objects WHERE name LIKE 'mz_view_primary_idx%';
  130. name
  131. -----
  132. mz_view_primary_idx
  133. ! ALTER VIEW mz_view_primary_idx RENAME TO renamed_index;
  134. exact:mz_view_primary_idx is an index not a view
  135. ! ALTER SOURCE mz_view_primary_idx RENAME TO renamed_index;
  136. exact:mz_view_primary_idx is an index not a source
  137. > ALTER INDEX mz_view_primary_idx RENAME TO renamed_index;
  138. > SELECT name FROM public_objects WHERE name LIKE 'mz_view_primary_idx%';
  139. name
  140. -----
  141. > SELECT name FROM public_objects WHERE name LIKE 'renamed_index%';
  142. name
  143. -----
  144. renamed_index
  145. > SELECT name FROM public_objects WHERE name LIKE 'sink1%';
  146. name
  147. -----
  148. sink1
  149. ! ALTER VIEW sink1 RENAME TO renamed_sink;
  150. exact:sink1 is a sink not a view
  151. > ALTER SINK sink1 RENAME TO renamed_sink
  152. > SELECT name FROM public_objects WHERE name LIKE 'sink1%';
  153. name
  154. -----
  155. > SELECT name FROM public_objects WHERE name LIKE 'renamed_sink%';
  156. name
  157. -----
  158. renamed_sink
  159. # Clean up temp view
  160. > DROP VIEW public_objects;
  161. # Source was successfully renamed
  162. > SHOW SOURCES;
  163. name type cluster comment
  164. -----------------------------------------------------------------
  165. mz_data_progress progress <null> ""
  166. renamed_mz_data kafka <VARIABLE_OUTPUT> ""
  167. # Sink was successfully renamed
  168. > SHOW SINKS
  169. name type cluster comment
  170. ----------------------------------------------------
  171. renamed_sink kafka <VARIABLE_OUTPUT> ""
  172. # View was successfully renamed
  173. > SHOW VIEWS
  174. name comment
  175. --------------------------
  176. byzantine_view ""
  177. dependent_view ""
  178. oppositional_view ""
  179. renamed_mz_view ""
  180. # Item's own `CREATE VIEW` statement updated
  181. > SHOW CREATE VIEW renamed_mz_view
  182. name create_sql
  183. ---------------------------------------------------------------------------------------------------------------------------------------------------
  184. materialize.public.renamed_mz_view "CREATE VIEW\n materialize.public.renamed_mz_view AS SELECT * FROM materialize.public.renamed_mz_data_tbl;"
  185. # Item's indexes are properly re-attributed
  186. > SHOW INDEXES ON renamed_mz_view
  187. name on cluster key comment
  188. --------------------------------------------------------------------------------------------
  189. renamed_index renamed_mz_view <VARIABLE_OUTPUT> {a,b} ""
  190. > SHOW CREATE INDEX renamed_index
  191. name create_sql
  192. ---------------------------------------------------------------------------------------------------------------------
  193. materialize.public.renamed_index "CREATE INDEX renamed_index IN CLUSTER <VARIABLE_OUTPUT> ON materialize.public.renamed_mz_view (a, b);"
  194. # Simple dependencies are renamed
  195. > SHOW CREATE VIEW dependent_view
  196. name create_sql
  197. ------------------------------------------------------------------------------------------------------------------------------------------------
  198. materialize.public.dependent_view "CREATE VIEW materialize.public.dependent_view AS SELECT * FROM materialize.public.renamed_mz_view;"
  199. > SHOW CREATE SINK renamed_sink
  200. name create_sql
  201. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  202. materialize.public.renamed_sink "CREATE SINK materialize.public.renamed_sink IN CLUSTER <VARIABLE_OUTPUT> FROM materialize.public.renamed_mz_data_tbl INTO KAFKA CONNECTION materialize.public.kafka_conn (TOPIC = 'testdrive-snk1-${testdrive.seed}') FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY CONNECTION materialize.public.csr_conn ENVELOPE DEBEZIUM;"
  203. # Simple dependencies with both fully qualified and unqualified item references are renamed
  204. > SHOW CREATE VIEW byzantine_view
  205. name create_sql
  206. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  207. materialize.public.byzantine_view "CREATE VIEW\n materialize.public.byzantine_view\n AS\n SELECT renamed_mz_data_tbl.a, renamed_mz_view.b\n FROM\n materialize.public.renamed_mz_data_tbl\n JOIN materialize.public.renamed_mz_view ON renamed_mz_data_tbl.a = renamed_mz_view.a;"
  208. # Strings containing old item name are not modified
  209. > SHOW CREATE VIEW oppositional_view
  210. name create_sql
  211. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  212. materialize.public.oppositional_view "CREATE VIEW\n materialize.public.oppositional_view\n AS\n SELECT *\n FROM materialize.public.renamed_mz_view\n WHERE b = '\n an adversarial string\n \"materialize\".\"public\".\"mz_data_tbl\"\n ';"
  213. # 🔬 Name collisions
  214. > ALTER VIEW renamed_mz_view RENAME TO t1
  215. > CREATE VIEW a AS SELECT 1 AS a
  216. > CREATE VIEW v0 AS SELECT 2 AS b
  217. > CREATE VIEW t2 (a, b, t1_a, t1_b) AS
  218. SELECT * FROM a
  219. JOIN v0
  220. ON a.a = v0.b
  221. JOIN t1
  222. ON a.a = t1.a;
  223. # ❌ Identifiers used in dependent items
  224. ! ALTER VIEW t1 RENAME TO b;
  225. contains:renaming conflict
  226. ! ALTER VIEW t1 RENAME TO materialize;
  227. contains:renaming conflict
  228. ! ALTER VIEW t1 RENAME TO public;
  229. contains:renaming conflict
  230. # ❌ Identifiers used in own definition
  231. # `materialize.public.a` contains an unqualified reference to `materialize.public.t1.a`.
  232. ! ALTER VIEW a RENAME TO anything
  233. contains:renaming conflict
  234. ! ALTER VIEW v0 RENAME TO b
  235. contains:renaming conflict
  236. # ❌ Name used by another item in schema's catalog
  237. ! ALTER VIEW t1 RENAME TO a
  238. contains:catalog item 'a' already exists
  239. ! ALTER VIEW t1 RENAME TO dependent_view;
  240. contains:catalog item 'dependent_view' already exists
  241. # 🔬 Aliases
  242. > CREATE VIEW table_alias_check AS
  243. SELECT t1.a AS b
  244. FROM (
  245. SELECT a
  246. FROM t1
  247. ) AS t1;
  248. # ❌ View name used as alias
  249. ! ALTER VIEW t1 RENAME TO anything
  250. contains:renaming conflict
  251. # 🔬 Unresolvable without scope analysis
  252. # These are example queries whose ambiguity cannot be resolved through
  253. # simple ident analysis; i.e. you need either real or strictly inferred scope
  254. # information to disambiguate references to `db0.scm0.z`.
  255. > CREATE DATABASE IF NOT EXISTS db0;
  256. > CREATE SCHEMA IF NOT EXISTS db0.scm0;
  257. > CREATE VIEW db0.scm0.z AS SELECT 1 AS a;
  258. > CREATE SCHEMA IF NOT EXISTS materialize.db0;
  259. > CREATE VIEW materialize.db0.scm0 AS SELECT 1 AS z;
  260. > CREATE VIEW final_boss_1 AS
  261. SELECT db0.scm0.z, db0.scm0.z.a
  262. FROM db0.scm0.z
  263. JOIN db0.scm0
  264. ON db0.scm0.z = db0.scm0.z.a;
  265. # ❌ Item name used as column
  266. ! ALTER VIEW db0.scm0.z RENAME TO anything
  267. contains:renaming conflict
  268. # ❌ Item name used as schema
  269. ! ALTER VIEW db0.scm0 RENAME TO anything
  270. contains:renaming conflict
  271. > CREATE SCHEMA IF NOT EXISTS materialize.scm0;
  272. > CREATE VIEW materialize.scm0.z AS SELECT 1 AS a;
  273. > CREATE VIEW materialize.public.scm0 AS SELECT 1 AS z;
  274. > CREATE VIEW final_boss_2 AS
  275. SELECT scm0.z, scm0.z.a
  276. FROM scm0.z
  277. JOIN scm0
  278. ON scm0.z = scm0.z.a;
  279. # ❌ Item name used as column
  280. ! ALTER VIEW scm0.z RENAME TO anything
  281. contains:renaming conflict
  282. # ❌ Item name used as schema
  283. ! ALTER VIEW scm0 RENAME TO anything
  284. contains:renaming conflict
  285. # 🔬 DB::DB
  286. # 🔬🔬 DB::DB - DB-level qualification
  287. > CREATE DATABASE IF NOT EXISTS db1
  288. > CREATE DATABASE IF NOT EXISTS db2
  289. > CREATE SCHEMA IF NOT EXISTS db1.scm1
  290. > CREATE SCHEMA IF NOT EXISTS db2.scm1
  291. > CREATE VIEW db1.scm1.v AS SELECT 1 as a;
  292. > CREATE VIEW db2.scm1.v AS SELECT 2 as b;
  293. # References to `v` are ambiguous because not all references are sufficiently
  294. # qualified. This won't work until we have database-level qualification.
  295. > CREATE VIEW db1_db2_scm1_min_qual_invalid AS
  296. SELECT * FROM
  297. (
  298. SELECT v.a FROM db1.scm1.v
  299. ) AS l
  300. JOIN (
  301. SELECT v.b FROM db2.scm1.v
  302. ) AS r
  303. ON l.a = r.b;
  304. # ❌ Insufficient qualification
  305. ! ALTER VIEW db1.scm1.v rename to anything;
  306. contains:renaming conflict
  307. ! ALTER VIEW db2.scm1.v rename to anything;
  308. contains:renaming conflict
  309. > DROP VIEW db1_db2_scm1_min_qual_invalid
  310. # References to `v` are ambiguous because not all references are sufficiently
  311. # qualified.
  312. > CREATE VIEW db1_db2_scm1_mix_qual_invalid AS
  313. SELECT * FROM
  314. (
  315. SELECT db1.scm1.v.a FROM db1.scm1.v
  316. ) AS l
  317. JOIN (
  318. SELECT scm1.v.b FROM db2.scm1.v
  319. ) AS r
  320. ON l.a = r.b;
  321. # ❌ Insufficient qualification
  322. ! ALTER VIEW db1.scm1.v rename to anything;
  323. contains:renaming conflict
  324. ! ALTER VIEW db2.scm1.v rename to anything;
  325. contains:renaming conflict
  326. > DROP VIEW db1_db2_scm1_mix_qual_invalid
  327. # Fully qualifying references allows renaming
  328. > CREATE VIEW db1_db2_scm1_valid_qual AS
  329. SELECT * FROM
  330. (
  331. SELECT db1.scm1.v.a FROM db1.scm1.v
  332. ) AS l
  333. JOIN (
  334. SELECT db2.scm1.v.b FROM db2.scm1.v
  335. ) AS r
  336. ON l.a = r.b;
  337. # ✅ Sufficient qualification + new idents
  338. > ALTER VIEW db1.scm1.v RENAME TO v0
  339. > ALTER VIEW db1.scm1.v0 RENAME TO v1
  340. > ALTER VIEW db2.scm1.v RENAME TO v2
  341. > SHOW CREATE VIEW db1_db2_scm1_valid_qual
  342. name create_sql
  343. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  344. materialize.public.db1_db2_scm1_valid_qual "CREATE VIEW\n materialize.public.db1_db2_scm1_valid_qual\n AS\n SELECT *\n FROM\n (SELECT db1.scm1.v1.a FROM db1.scm1.v1) AS l\n JOIN (SELECT db2.scm1.v2.b FROM db2.scm1.v2) AS r ON l.a = r.b;"
  345. > CREATE VIEW "materialize"."public"."db1_db2_scm1_valid_qual_test" AS SELECT * FROM (SELECT "db1"."scm1"."v1"."a" FROM "db1"."scm1"."v1") AS "l" JOIN (SELECT "db2"."scm1"."v2"."b" FROM "db2"."scm1"."v2") AS "r" ON "l"."a" = "r"."b"
  346. # 🔬🔬 DB::DB - No qualification necessary
  347. # Evaluate ability to handle two database-qualified references.
  348. > CREATE SCHEMA db2.scm2;
  349. > CREATE VIEW db2.scm2.v2 AS
  350. SELECT 1 AS z;
  351. > CREATE VIEW db_db_qual_diff_s_v AS
  352. SELECT db2.scm2.v2.z
  353. FROM db2.scm2.v2
  354. JOIN db1.scm1.v1
  355. ON db2.scm2.v2.z = db1.scm1.v1.a
  356. # ❌ Identifiers used in dependent items
  357. ! ALTER VIEW db2.scm2.v2 RENAME TO db2;
  358. contains:renaming conflict
  359. ! ALTER VIEW db2.scm2.v2 RENAME TO scm2;
  360. contains:renaming conflict
  361. ! ALTER VIEW db2.scm2.v2 RENAME TO z;
  362. contains:renaming conflict
  363. ! ALTER VIEW db2.scm2.v2 RENAME TO scm2;
  364. contains:renaming conflict
  365. ! ALTER VIEW db2.scm2.v2 RENAME TO a;
  366. contains:renaming conflict
  367. # ✅ New idents
  368. > ALTER VIEW db2.scm2.v2 RENAME TO v3;
  369. > ALTER VIEW db1.scm1.v1 RENAME TO v4;
  370. > SHOW CREATE VIEW db_db_qual_diff_s_v
  371. name create_sql
  372. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  373. materialize.public.db_db_qual_diff_s_v "CREATE VIEW\n materialize.public.db_db_qual_diff_s_v\n AS SELECT db2.scm2.v3.z FROM db2.scm2.v3 JOIN db1.scm1.v4 ON db2.scm2.v3.z = db1.scm1.v4.a;"
  374. > CREATE VIEW "materialize"."public"."db_db_qual_diff_s_v_test" AS SELECT "db2"."scm2"."v3"."z" FROM "db2"."scm2"."v3" JOIN "db1"."scm1"."v4" ON "db2"."scm2"."v3"."z" = "db1"."scm1"."v4"."a"
  375. # 🔬 DB::Schema
  376. # Evaluate ability to handle one database-qualified reference and one
  377. # schema-qualified reference.
  378. > CREATE SCHEMA IF NOT EXISTS scm3
  379. > CREATE VIEW scm3.v2 AS
  380. SELECT 1 AS z;
  381. > CREATE VIEW db_scm_qual AS
  382. SELECT scm3.v2.z, db1.scm1.v4.a
  383. FROM scm3.v2
  384. JOIN db1.scm1.v4
  385. ON scm3.v2.z = db1.scm1.v4.a;
  386. > ALTER VIEW scm3.v2 RENAME TO v3;
  387. > ALTER VIEW db1.scm1.v4 RENAME TO v5;
  388. > SHOW CREATE VIEW db_scm_qual
  389. name create_sql
  390. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  391. materialize.public.db_scm_qual "CREATE VIEW\n materialize.public.db_scm_qual\n AS\n SELECT scm3.v3.z, db1.scm1.v5.a\n FROM materialize.scm3.v3 JOIN db1.scm1.v5 ON scm3.v3.z = db1.scm1.v5.a;"
  392. > CREATE VIEW "materialize"."public"."db_scm_qual_test" AS SELECT "scm3"."v3"."z", "db1"."scm1"."v5"."a" FROM "materialize"."scm3"."v3" JOIN "db1"."scm1"."v5" ON "scm3"."v3"."z" = "db1"."scm1"."v5"."a"
  393. # 🔬 DB::View
  394. # Evaluate ability to handle one database-qualified reference and one
  395. # implicitly-qualified reference.
  396. > CREATE VIEW v1 AS
  397. SELECT 1 AS z;
  398. > CREATE VIEW db_v_qual AS
  399. SELECT v1.z, db1.scm1.v5.a
  400. FROM v1
  401. JOIN db1.scm1.v5
  402. ON v1.z = db1.scm1.v5.a;
  403. # ❌ Identifiers used in dependent items
  404. ! ALTER VIEW v1 RENAME TO z;
  405. contains:renaming conflict
  406. ! ALTER VIEW v1 RENAME TO db1;
  407. contains:renaming conflict
  408. ! ALTER VIEW v1 RENAME TO scm1;
  409. contains:renaming conflict
  410. ! ALTER VIEW v1 RENAME TO v5;
  411. contains:renaming conflict
  412. ! ALTER VIEW db1.scm1.v5 RENAME TO v1;
  413. contains:renaming conflict
  414. # ✅ New idents
  415. > ALTER VIEW v1 RENAME TO v2;
  416. > ALTER VIEW db1.scm1.v5 RENAME TO v6;
  417. > SHOW CREATE VIEW db_v_qual
  418. name create_sql
  419. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  420. materialize.public.db_v_qual "CREATE VIEW\n materialize.public.db_v_qual\n AS\n SELECT v2.z, db1.scm1.v6.a\n FROM materialize.public.v2 JOIN db1.scm1.v6 ON v2.z = db1.scm1.v6.a;"
  421. > CREATE VIEW "materialize"."public"."db_v_qual_test" AS SELECT "v2"."z", "db1"."scm1"."v6"."a" FROM "materialize"."public"."v2" JOIN "db1"."scm1"."v6" ON "v2"."z" = "db1"."scm1"."v6"."a"
  422. # 🔬 Schema::Schema
  423. # 🔬🔬 Require schema-level qualification
  424. > CREATE DATABASE IF NOT EXISTS db1
  425. > CREATE SCHEMA IF NOT EXISTS db1.scm1
  426. > CREATE SCHEMA IF NOT EXISTS db1.scm2
  427. > CREATE VIEW db1.scm1.v AS SELECT 1 as a;
  428. > CREATE VIEW db1.scm2.v AS SELECT 2 as b;
  429. # References to `v` are ambiguous because not all references are sufficiently
  430. # qualified. This won't work until we have schema-level qualification.
  431. > CREATE VIEW db1_scm1_scm2_min_qual_invalid AS
  432. SELECT * FROM
  433. (
  434. SELECT v.a FROM db1.scm1.v
  435. ) AS l
  436. JOIN (
  437. SELECT v.b FROM db1.scm2.v
  438. ) AS r
  439. ON l.a = r.b;
  440. # ❌ Insufficient qualification
  441. ! ALTER VIEW db1.scm1.v rename to anything;
  442. contains:renaming conflict
  443. ! ALTER VIEW db1.scm2.v rename to anything;
  444. contains:renaming conflict
  445. > DROP VIEW db1_scm1_scm2_min_qual_invalid
  446. # References to `v` are ambiguous because not all references are sufficiently
  447. # qualified.
  448. > CREATE VIEW db1_scm1_scm2_mix_qual_invalid AS
  449. SELECT * FROM
  450. (
  451. SELECT db1.scm1.v.a FROM db1.scm1.v
  452. ) AS l
  453. JOIN (
  454. SELECT v.b FROM db1.scm2.v
  455. ) AS r
  456. ON l.a = r.b;
  457. # ❌ Insufficient qualification
  458. ! ALTER VIEW db1.scm1.v rename to anything;
  459. contains:renaming conflict
  460. ! ALTER VIEW db1.scm2.v rename to anything;
  461. contains:renaming conflict
  462. > DROP VIEW db1_scm1_scm2_mix_qual_invalid
  463. # Qualifying to the point of differentiation allows renaming
  464. > CREATE VIEW db1_scm1_scm2_valid_qual AS
  465. SELECT * FROM
  466. (
  467. SELECT scm1.v.a FROM db1.scm1.v
  468. ) AS l
  469. JOIN (
  470. SELECT scm2.v.b FROM db1.scm2.v
  471. ) AS r
  472. ON l.a = r.b;
  473. # ✅ Sufficient qualification + new idents
  474. > ALTER VIEW db1.scm1.v RENAME TO v3
  475. > ALTER VIEW db1.scm1.v3 RENAME TO v4
  476. > ALTER VIEW db1.scm2.v RENAME TO v5
  477. > SHOW CREATE VIEW db1_scm1_scm2_valid_qual
  478. name create_sql
  479. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  480. materialize.public.db1_scm1_scm2_valid_qual "CREATE VIEW\n materialize.public.db1_scm1_scm2_valid_qual\n AS\n SELECT *\n FROM\n (SELECT scm1.v4.a FROM db1.scm1.v4) AS l\n JOIN (SELECT scm2.v5.b FROM db1.scm2.v5) AS r ON l.a = r.b;"
  481. > CREATE VIEW "materialize"."public"."db1_scm1_scm2_valid_qual_test" AS SELECT * FROM (SELECT "scm1"."v4"."a" FROM "db1"."scm1"."v4") AS "l" JOIN (SELECT "scm2"."v5"."b" FROM "db1"."scm2"."v5") AS "r" ON "l"."a" = "r"."b"
  482. # 🔬🔬 No qualification necessary
  483. > CREATE SCHEMA IF NOT EXISTS scm4;
  484. > CREATE SCHEMA IF NOT EXISTS scm5;
  485. > CREATE VIEW scm4.v1 AS
  486. SELECT 1 AS z;
  487. > CREATE VIEW scm5.v2 AS
  488. SELECT 1 AS a;
  489. > CREATE VIEW scm_scm_qual AS
  490. SELECT scm4.v1.z, scm5.v2.a
  491. FROM scm4.v1
  492. JOIN scm5.v2
  493. ON scm4.v1.z = scm5.v2.a;
  494. # ❌ Identifiers used in dependent items
  495. ! ALTER VIEW scm4.v1 RENAME TO z;
  496. contains:renaming conflict
  497. ! ALTER VIEW scm4.v1 RENAME TO scm5;
  498. contains:renaming conflict
  499. ! ALTER VIEW scm4.v1 RENAME TO v2;
  500. contains:renaming conflict
  501. ! ALTER VIEW scm4.v1 RENAME TO a;
  502. contains:renaming conflict
  503. ! ALTER VIEW scm5.v2 RENAME TO a;
  504. contains:renaming conflict
  505. ! ALTER VIEW scm5.v2 RENAME TO v1;
  506. contains:renaming conflict
  507. # ✅ New idents
  508. > ALTER VIEW scm4.v1 RENAME TO v3;
  509. > ALTER VIEW scm5.v2 RENAME TO v4;
  510. > SHOW CREATE VIEW scm_scm_qual
  511. name create_sql
  512. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  513. materialize.public.scm_scm_qual "CREATE VIEW\n materialize.public.scm_scm_qual\n AS\n SELECT scm4.v3.z, scm5.v4.a\n FROM materialize.scm4.v3 JOIN materialize.scm5.v4 ON scm4.v3.z = scm5.v4.a;"
  514. > CREATE VIEW "materialize"."public"."scm_scm_qual_test" AS SELECT "scm4"."v3"."z", "scm5"."v4"."a" FROM "materialize"."scm4"."v3" JOIN "materialize"."scm5"."v4" ON "scm4"."v3"."z" = "scm5"."v4"."a"
  515. # 🔬 Schema::View
  516. # Evaluate ability to handle one schema-qualified reference and one
  517. # implicitly-qualified reference.
  518. > CREATE VIEW v1 AS
  519. SELECT 1 AS z;
  520. > CREATE VIEW scm_v_qual AS
  521. SELECT v1.z, scm5.v4.a
  522. FROM v1
  523. JOIN scm5.v4
  524. ON v1.z = scm5.v4.a;
  525. # ❌ Identifiers used in dependent items
  526. ! ALTER VIEW v1 RENAME TO z;
  527. contains:renaming conflict
  528. ! ALTER VIEW v1 RENAME TO scm5;
  529. contains:renaming conflict
  530. ! ALTER VIEW v1 RENAME TO v4;
  531. contains:renaming conflict
  532. # ✅ New idents
  533. > ALTER VIEW v1 RENAME TO v3;
  534. > ALTER VIEW scm5.v4 RENAME TO v6;
  535. > SHOW CREATE VIEW scm_v_qual
  536. name create_sql
  537. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  538. materialize.public.scm_v_qual "CREATE VIEW\n materialize.public.scm_v_qual\n AS\n SELECT v3.z, scm5.v6.a\n FROM materialize.public.v3 JOIN materialize.scm5.v6 ON v3.z = scm5.v6.a;"
  539. > CREATE VIEW "materialize"."public"."scm_v_qual_test" AS SELECT "v3"."z", "scm5"."v6"."a" FROM "materialize"."public"."v3" JOIN "materialize"."scm5"."v6" ON "v3"."z" = "scm5"."v6"."a"
  540. # 🔬 View::View
  541. # Evaluate ability to handle two implicitly-qualified references.
  542. > CREATE VIEW v4 AS
  543. SELECT 1 AS a
  544. > CREATE VIEW v_v_qual AS
  545. SELECT v3.z, v4.a
  546. FROM v3
  547. JOIN v4
  548. ON v3.z = v4.a
  549. # ❌ Identifiers used in dependent items
  550. ! ALTER VIEW v4 RENAME TO z;
  551. contains:renaming conflict
  552. # ✅ New idents
  553. > ALTER VIEW v4 RENAME TO v6;
  554. > ALTER VIEW v3 RENAME TO v5;
  555. > SHOW CREATE VIEW v_v_qual
  556. name create_sql
  557. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  558. materialize.public.v_v_qual "CREATE VIEW\n materialize.public.v_v_qual\n AS SELECT v5.z, v6.a FROM materialize.public.v5 JOIN materialize.public.v6 ON v5.z = v6.a;"
  559. > CREATE VIEW "materialize"."public"."v_v_qual_test" AS SELECT "v5"."z", "v6"."a" FROM "materialize"."public"."v5" JOIN "materialize"."public"."v6" ON "v5"."z" = "v6"."a"
  560. # 🔬 Qualified wildcard
  561. > CREATE VIEW qualified_wildcard AS
  562. SELECT v5.*
  563. FROM v5
  564. # ✅ New idents
  565. > ALTER VIEW v5 RENAME TO v7
  566. > SHOW CREATE VIEW qualified_wildcard
  567. name create_sql
  568. ---------------------------------------------------------------------------------------------------------------------------------------------------------------
  569. materialize.public.qualified_wildcard "CREATE VIEW materialize.public.qualified_wildcard AS SELECT v7.* FROM materialize.public.v7;"
  570. > CREATE VIEW "materialize"."public"."qualified_wildcard_test" AS SELECT "v7".* FROM "materialize"."public"."v7"
  571. # 🔬 WHERE...IN
  572. > CREATE VIEW where_in_subquery AS
  573. SELECT b FROM t1 WHERE a IN (SELECT a FROM scm5.v6);
  574. > CREATE VIEW where_in_literal AS
  575. SELECT b FROM t1 WHERE b IN ('v8')
  576. # ❌ Identifiers used in dependent items
  577. ! ALTER VIEW where_in_subquery RENAME TO scm5
  578. contains:renaming conflict
  579. # ✅ New idents
  580. > ALTER VIEW where_in_literal RENAME TO v8
  581. > ALTER VIEW v8 RENAME TO v9
  582. > SHOW CREATE VIEW v9
  583. name create_sql
  584. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  585. materialize.public.v9 "CREATE VIEW materialize.public.v9 AS SELECT b FROM materialize.public.t1 WHERE b IN ( 'v8' );"
  586. > CREATE VIEW "materialize"."public"."where_in_literal_test" AS SELECT "b" FROM "materialize"."public"."t1" WHERE "b" IN ('v8')
  587. # 🔬🔬🔬 Spaces
  588. > CREATE VIEW space AS
  589. SELECT 1 as "has space";
  590. > CREATE VIEW "already has space" AS
  591. SELECT 1 as my_space;
  592. > CREATE VIEW space_dependent AS
  593. SELECT * FROM space
  594. JOIN "already has space"
  595. ON "already has space".my_space = space."has space";
  596. # ❌ Identifiers used in own definition
  597. ! ALTER VIEW space RENAME TO "has space"
  598. contains:renaming conflict
  599. ! ALTER VIEW "already has space" RENAME TO my_space
  600. contains:renaming conflict
  601. # ✅ New idents
  602. > ALTER VIEW space RENAME TO "now has space"
  603. > ALTER VIEW "already has space" RENAME TO "still has space"
  604. > SHOW CREATE VIEW space_dependent
  605. name create_sql
  606. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  607. materialize.public.space_dependent "CREATE VIEW\n materialize.public.space_dependent\n AS\n SELECT *\n FROM\n materialize.public.\"now has space\"\n JOIN\n materialize.public.\"still has space\"\n ON \"still has space\".my_space = \"now has space\".\"has space\";"
  608. > CREATE VIEW "materialize"."public"."space_dependent_test" AS SELECT * FROM "materialize"."public"."now has space" JOIN "materialize"."public"."still has space" ON "still has space"."my_space" = "now has space"."has space"
  609. # 🔬 Keyword
  610. > CREATE VIEW natural AS
  611. SELECT * FROM t1 NATURAL JOIN t1 AS a;
  612. # ✅ Keywords are never trapped in a rename
  613. > ALTER VIEW natural RENAME TO unnatural
  614. > SHOW CREATE VIEW unnatural
  615. name create_sql
  616. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  617. materialize.public.unnatural "CREATE VIEW\n materialize.public.unnatural\n AS SELECT * FROM materialize.public.t1 NATURAL JOIN materialize.public.t1 AS a;"
  618. > CREATE VIEW "materialize"."public"."unnatural_test" AS SELECT * FROM "materialize"."public"."t1" NATURAL JOIN "materialize"."public"."t1" AS "a"
  619. # 🔬 Function names
  620. > CREATE VIEW func AS
  621. SELECT count(1)
  622. > CREATE VIEW no_func AS
  623. SELECT 1 AS a;
  624. > CREATE VIEW func_dependency (a, x_a) AS
  625. SELECT * FROM no_func
  626. JOIN (
  627. SELECT * FROM no_func
  628. ) AS x
  629. ON no_func.a = x.a;
  630. # ❌ Identifiers used in dependent items
  631. ! ALTER VIEW func RENAME TO count
  632. contains:renaming conflict
  633. # ✅ Non-colliding function name
  634. > ALTER VIEW no_func RENAME TO count
  635. > SHOW CREATE VIEW func_dependency
  636. name create_sql
  637. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  638. materialize.public.func_dependency "CREATE VIEW\n materialize.public.func_dependency\n (a, x_a)\n AS\n SELECT *\n FROM\n materialize.public.count\n JOIN (SELECT * FROM materialize.public.count) AS x ON count.a = x.a;"
  639. > CREATE VIEW "materialize"."public"."func_dependency_test" ("a", "x_a") AS SELECT * FROM count JOIN (SELECT * FROM count) AS x ON count.a = x.a
  640. > SHOW CREATE VIEW count
  641. name create_sql
  642. ---------------------------------------------------------------------------------------
  643. materialize.public.count "CREATE VIEW materialize.public.count AS SELECT 1 AS a;"
  644. > DROP VIEW count CASCADE;
  645. > CREATE VIEW count AS SELECT 1
  646. > CREATE TABLE j (b int)
  647. > SHOW TABLES
  648. name comment
  649. -------------------------------
  650. j ""
  651. renamed_mz_data_tbl ""
  652. > ALTER TABLE j RENAME TO renamed_j
  653. > SHOW TABLES
  654. name comment
  655. -------------------------------
  656. renamed_j ""
  657. renamed_mz_data_tbl ""
  658. > SELECT name FROM mz_tables WHERE id like 'u%';
  659. name
  660. ------
  661. renamed_j
  662. renamed_mz_data_tbl
  663. # Test that after renaming a materialized object it is possible to create
  664. # another object with the original name. This used to fail because the index
  665. # on the original object is not renamed. See database-issues#1585.
  666. > CREATE TABLE t_orig ()
  667. > ALTER TABLE t_orig RENAME TO t_dontcare
  668. > CREATE TABLE t_orig ()
  669. > CREATE VIEW v_orig AS SELECT 1
  670. > CREATE DEFAULT INDEX ON v_orig
  671. > ALTER VIEW v_orig RENAME TO v_dontcare
  672. > CREATE VIEW v_orig AS SELECT 1
  673. > CREATE DEFAULT INDEX ON v_orig
  674. # Test renaming a schema that contains objects.
  675. > CREATE SCHEMA to_be_renamed;
  676. > SET SCHEMA TO to_be_renamed;
  677. > CREATE SOURCE mz_data
  678. IN CLUSTER ${arg.single-replica-cluster}
  679. FROM KAFKA CONNECTION public.kafka_conn (TOPIC 'testdrive-data-${testdrive.seed}')
  680. > CREATE TABLE mz_data_tbl FROM SOURCE mz_data (REFERENCE "testdrive-data-${testdrive.seed}")
  681. FORMAT AVRO USING SCHEMA '${writer-schema}'
  682. > CREATE DEFAULT INDEX ON mz_data
  683. > CREATE SINK sink1
  684. IN CLUSTER ${arg.single-replica-cluster}
  685. FROM mz_data_tbl
  686. INTO KAFKA CONNECTION public.kafka_conn (TOPIC 'testdrive-snk1-rename-schema-${testdrive.seed}')
  687. FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY CONNECTION public.csr_conn
  688. ENVELOPE DEBEZIUM
  689. > SET SCHEMA TO public;
  690. # Check the initial state of the create_sql.
  691. > SHOW CREATE SOURCE to_be_renamed.mz_data;
  692. name create_sql
  693. ---------------------------------------------------------------------------------------------------------------------------------------------------
  694. materialize.to_be_renamed.mz_data "CREATE SOURCE materialize.to_be_renamed.mz_data\nIN CLUSTER <VARIABLE_OUTPUT>\nFROM KAFKA CONNECTION materialize.public.kafka_conn (TOPIC = '<VARIABLE_OUTPUT>')\nEXPOSE PROGRESS AS materialize.to_be_renamed.mz_data_progress;"
  695. > SHOW CREATE SINK to_be_renamed.sink1;
  696. name create_sql
  697. ---------------------------------------------------------------------------------------------------------------------------------------------------
  698. materialize.to_be_renamed.sink1 "CREATE SINK materialize.to_be_renamed.sink1 IN CLUSTER <VARIABLE_OUTPUT> FROM materialize.to_be_renamed.mz_data_tbl INTO KAFKA CONNECTION materialize.public.kafka_conn (TOPIC = 'testdrive-snk1-rename-schema-${testdrive.seed}') FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY CONNECTION materialize.public.csr_conn ENVELOPE DEBEZIUM;"
  699. # Make sure the create_sql got updated.
  700. > ALTER SCHEMA to_be_renamed RENAME TO foo_bar;
  701. > SHOW CREATE SOURCE foo_bar.mz_data;
  702. name create_sql
  703. ---------------------------------------------------------------------------------------------------------------------------------------------------
  704. materialize.foo_bar.mz_data "CREATE SOURCE materialize.foo_bar.mz_data\nIN CLUSTER <VARIABLE_OUTPUT>\nFROM KAFKA CONNECTION materialize.public.kafka_conn (TOPIC = '<VARIABLE_OUTPUT>')\nEXPOSE PROGRESS AS materialize.foo_bar.mz_data_progress;"
  705. > SHOW CREATE SINK foo_bar.sink1;
  706. name create_sql
  707. ---------------------------------------------------------------------------------------------------------------------------------------------------
  708. materialize.foo_bar.sink1 "CREATE SINK materialize.foo_bar.sink1 IN CLUSTER <VARIABLE_OUTPUT> FROM materialize.foo_bar.mz_data_tbl INTO KAFKA CONNECTION materialize.public.kafka_conn (TOPIC = 'testdrive-snk1-rename-schema-${testdrive.seed}') FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY CONNECTION materialize.public.csr_conn ENVELOPE DEBEZIUM;"