alter_table.slt 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  1. # Copyright 2015 - 2019 The Cockroach Authors. All rights reserved.
  2. # Copyright Materialize, Inc. and contributors. All rights reserved.
  3. #
  4. # Use of this software is governed by the Business Source License
  5. # included in the LICENSE file at the root of this repository.
  6. #
  7. # As of the Change Date specified in that file, in accordance with
  8. # the Business Source License, use of this software will be governed
  9. # by the Apache License, Version 2.0.
  10. #
  11. # This file is derived from the logic test suite in CockroachDB. The
  12. # original file was retrieved on June 10, 2019 from:
  13. #
  14. # https://github.com/cockroachdb/cockroach/blob/d2f7fbf5dd1fc1a099bbad790a2e1f7c60a66cc3/pkg/sql/logictest/testdata/logic_test/alter_table
  15. #
  16. # The original source code is subject to the terms of the Apache
  17. # 2.0 license, a copy of which can be found in the LICENSE file at the
  18. # root of this repository.
  19. # not supported yet
  20. halt
  21. mode cockroach
  22. statement ok
  23. CREATE TABLE other (b INT PRIMARY KEY)
  24. statement ok
  25. INSERT INTO other VALUES (9)
  26. statement ok
  27. CREATE TABLE t (a INT PRIMARY KEY CHECK(a > 0), f INT REFERENCES other, INDEX (f))
  28. statement ok
  29. INSERT INTO t VALUES (1, 9)
  30. statement error syntax error at or near "*"
  31. ALTER TABLE t RENAME TO t.*
  32. statement ok
  33. ALTER TABLE t ADD b INT
  34. query TTBTTTB colnames
  35. SHOW COLUMNS FROM t
  36. ----
  37. column_name data_type is_nullable column_default generation_expression indices is_hidden
  38. a INT8 false NULL · {primary,t_f_idx} false
  39. f INT8 true NULL · {t_f_idx} false
  40. b INT8 true NULL · {} false
  41. statement ok
  42. ALTER TABLE t ADD CONSTRAINT foo UNIQUE (b)
  43. query TTTTRT
  44. SELECT job_type, description, user_name, status, fraction_completed, error
  45. FROM crdb_internal.jobs
  46. WHERE job_type = 'SCHEMA CHANGE'
  47. ORDER BY created DESC
  48. LIMIT 1
  49. ----
  50. SCHEMA CHANGE ALTER TABLE test.public.t ADD CONSTRAINT foo UNIQUE (b) root succeeded 1 ·
  51. statement error duplicate constraint name: "foo"
  52. ALTER TABLE t ADD CONSTRAINT foo UNIQUE (b)
  53. statement error multiple primary keys for table "t" are not allowed
  54. ALTER TABLE t ADD CONSTRAINT bar PRIMARY KEY (b)
  55. query TTBITTBB colnames
  56. SHOW INDEXES ON t
  57. ----
  58. table_name index_name non_unique seq_in_index column_name direction storing implicit
  59. t primary false 1 a ASC false false
  60. t t_f_idx true 1 f ASC false false
  61. t t_f_idx true 2 a ASC false true
  62. t foo false 1 b ASC false false
  63. t foo false 2 a ASC false true
  64. query III
  65. SELECT * FROM t
  66. ----
  67. 1 9 NULL
  68. statement ok
  69. ALTER TABLE t ADD c INT
  70. statement ok
  71. INSERT INTO t VALUES (2, 9, 1, 1), (3, 9, 2, 1)
  72. statement error pgcode 23505 violates unique constraint "bar"
  73. ALTER TABLE t ADD CONSTRAINT bar UNIQUE (c)
  74. # Test that rollback was successful
  75. query TTTTTR
  76. SELECT job_type, regexp_replace(description, 'JOB \d+', 'JOB ...'), user_name, status, running_status, fraction_completed::decimal(10,2)
  77. FROM crdb_internal.jobs
  78. WHERE job_type = 'SCHEMA CHANGE'
  79. ORDER BY created DESC
  80. LIMIT 2
  81. ----
  82. SCHEMA CHANGE ROLL BACK JOB ...: ALTER TABLE test.public.t ADD CONSTRAINT bar UNIQUE (c) root running waiting for GC TTL 0.00
  83. SCHEMA CHANGE ALTER TABLE test.public.t ADD CONSTRAINT bar UNIQUE (c) root failed NULL 0.00
  84. query IIII colnames,rowsort
  85. SELECT * FROM t
  86. ----
  87. a f b c
  88. 1 9 NULL NULL
  89. 2 9 1 1
  90. 3 9 2 1
  91. query TTTTB colnames
  92. SHOW CONSTRAINTS FROM t
  93. ----
  94. table_name constraint_name constraint_type details validated
  95. t check_a CHECK CHECK (a > 0) true
  96. t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other (b) true
  97. t foo UNIQUE UNIQUE (b ASC) true
  98. t primary PRIMARY KEY PRIMARY KEY (a ASC) true
  99. statement error CHECK
  100. INSERT INTO t (a, f) VALUES (-2, 9)
  101. statement ok
  102. ALTER TABLE t DROP CONSTRAINT check_a
  103. statement ok
  104. INSERT INTO t (a, f) VALUES (-2, 9)
  105. statement error validation of CHECK "a > 0" failed on row: a=-2, f=9, b=NULL, c=NULL
  106. ALTER TABLE t ADD CONSTRAINT check_a CHECK (a > 0)
  107. statement ok
  108. DELETE FROM t WHERE a = -2
  109. statement ok
  110. ALTER TABLE t ADD CONSTRAINT check_a CHECK (a > 0)
  111. statement error CHECK
  112. INSERT INTO t (a) VALUES (-3)
  113. query TTTTB
  114. SHOW CONSTRAINTS FROM t
  115. ----
  116. t check_a CHECK CHECK (a > 0) true
  117. t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other (b) true
  118. t foo UNIQUE UNIQUE (b ASC) true
  119. t primary PRIMARY KEY PRIMARY KEY (a ASC) true
  120. statement error duplicate constraint name
  121. ALTER TABLE t ADD CONSTRAINT check_a CHECK (a > 0)
  122. statement error duplicate constraint name
  123. ALTER TABLE t ADD CONSTRAINT fk_f_ref_other FOREIGN KEY (a) REFERENCES other (b)
  124. # added constraints with generated names avoid name collisions.
  125. statement ok
  126. ALTER TABLE t ADD CHECK (a > 0)
  127. query TTTTB
  128. SHOW CONSTRAINTS FROM t
  129. ----
  130. t check_a CHECK CHECK (a > 0) true
  131. t check_a1 CHECK CHECK (a > 0) true
  132. t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other (b) true
  133. t foo UNIQUE UNIQUE (b ASC) true
  134. t primary PRIMARY KEY PRIMARY KEY (a ASC) true
  135. statement error constraint "typo" does not exist
  136. ALTER TABLE t VALIDATE CONSTRAINT typo
  137. # TODO(erik): re-enable test when unvalidated checks can be added
  138. #statement error validation of CHECK "a > 0" failed on row: a=-2, f=9, b=NULL, c=NULL
  139. #ALTER TABLE t VALIDATE CONSTRAINT check_a
  140. #statement ok
  141. #DELETE FROM t WHERE a = -2
  142. statement ok
  143. ALTER TABLE t VALIDATE CONSTRAINT check_a
  144. query TTTTB
  145. SHOW CONSTRAINTS FROM t
  146. ----
  147. t check_a CHECK CHECK (a > 0) true
  148. t check_a1 CHECK CHECK (a > 0) true
  149. t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other (b) true
  150. t foo UNIQUE UNIQUE (b ASC) true
  151. t primary PRIMARY KEY PRIMARY KEY (a ASC) true
  152. statement ok
  153. ALTER TABLE t DROP CONSTRAINT check_a, DROP CONSTRAINT check_a1
  154. statement error pgcode 42703 column "d" does not exist
  155. ALTER TABLE t DROP d
  156. statement ok
  157. ALTER TABLE t DROP IF EXISTS d
  158. statement error column "a" is referenced by the primary key
  159. ALTER TABLE t DROP a
  160. statement error constraint "bar" does not exist
  161. ALTER TABLE t DROP CONSTRAINT bar
  162. statement ok
  163. ALTER TABLE t DROP CONSTRAINT IF EXISTS bar
  164. statement error cannot drop UNIQUE constraint \"foo\" using ALTER TABLE DROP CONSTRAINT, use DROP INDEX CASCADE instead
  165. ALTER TABLE t DROP CONSTRAINT foo
  166. statement ok
  167. DROP INDEX foo CASCADE
  168. query TTTTTRT
  169. SELECT job_type, description, user_name, status, running_status, fraction_completed, error
  170. FROM crdb_internal.jobs
  171. WHERE job_type = 'SCHEMA CHANGE'
  172. ORDER BY created DESC
  173. LIMIT 1
  174. ----
  175. SCHEMA CHANGE DROP INDEX test.public.t@foo CASCADE root running waiting for GC TTL 0 ·
  176. query TTBITTBB colnames
  177. SHOW INDEXES ON t
  178. ----
  179. table_name index_name non_unique seq_in_index column_name direction storing implicit
  180. t primary false 1 a ASC false false
  181. t t_f_idx true 1 f ASC false false
  182. t t_f_idx true 2 a ASC false true
  183. statement ok
  184. ALTER TABLE t DROP b, DROP c
  185. query II rowsort
  186. SELECT * FROM t
  187. ----
  188. 1 9
  189. 2 9
  190. 3 9
  191. statement ok
  192. ALTER TABLE t ADD d INT UNIQUE
  193. statement ok
  194. INSERT INTO t VALUES (4, 9, 1)
  195. statement error duplicate key value \(d\)=\(1\) violates unique constraint \"t_d_key\"
  196. INSERT INTO t VALUES (5, 9, 1)
  197. # Add a column with no default value
  198. statement ok
  199. ALTER TABLE t ADD COLUMN x DECIMAL
  200. # Add a non NULL column with a default value
  201. statement ok
  202. ALTER TABLE t ADD COLUMN y DECIMAL NOT NULL DEFAULT (DECIMAL '1.3')
  203. statement error could not parse "1-3" as type decimal
  204. ALTER TABLE t ADD COLUMN p DECIMAL NOT NULL DEFAULT (DECIMAL '1-3')
  205. # Add a non NULL column with no default value
  206. statement error pgcode 23502 null value in column \"q\" violates not-null constraint
  207. ALTER TABLE t ADD COLUMN q DECIMAL NOT NULL
  208. statement ok
  209. ALTER TABLE t ADD COLUMN z DECIMAL DEFAULT (DECIMAL '1.4')
  210. statement ok
  211. INSERT INTO t VALUES (11, 9, 12, DECIMAL '1.0')
  212. statement ok
  213. INSERT INTO t (a, d) VALUES (13, 14)
  214. statement ok
  215. INSERT INTO t (a, d, y) VALUES (21, 22, DECIMAL '1.0')
  216. statement ok
  217. INSERT INTO t (a, d) VALUES (23, 24)
  218. statement error foreign key
  219. INSERT INTO t VALUES (31, 7, 32)
  220. statement error in use as a foreign key constraint
  221. DROP INDEX t@t_f_idx
  222. statement ok
  223. ALTER TABLE t DROP CONSTRAINT fk_f_ref_other
  224. statement ok
  225. INSERT INTO t VALUES (31, 7, 32)
  226. statement ok
  227. INSERT INTO t (a, d, x, y, z) VALUES (33, 34, DECIMAL '2.0', DECIMAL '2.1', DECIMAL '2.2')
  228. statement ok
  229. DROP INDEX t@t_f_idx
  230. query TTTTTRT
  231. SELECT job_type, description, user_name, status, running_status, fraction_completed, error
  232. FROM crdb_internal.jobs
  233. WHERE job_type = 'SCHEMA CHANGE'
  234. ORDER BY created DESC
  235. LIMIT 1
  236. ----
  237. SCHEMA CHANGE DROP INDEX test.public.t@t_f_idx root running waiting for GC TTL 0 ·
  238. statement ok
  239. ALTER TABLE t DROP COLUMN f
  240. query IITTT colnames,rowsort
  241. SELECT * FROM t
  242. ----
  243. a d x y z
  244. 1 NULL NULL 1.3 1.4
  245. 2 NULL NULL 1.3 1.4
  246. 3 NULL NULL 1.3 1.4
  247. 4 1 NULL 1.3 1.4
  248. 11 12 1.0 1.3 1.4
  249. 13 14 NULL 1.3 1.4
  250. 21 22 NULL 1.0 1.4
  251. 23 24 NULL 1.3 1.4
  252. 31 32 NULL 1.3 1.4
  253. 33 34 2.0 2.1 2.2
  254. statement ok
  255. ALTER TABLE t DROP COLUMN d
  256. statement ok
  257. ALTER TABLE t ADD COLUMN e INT; ALTER TABLE t ADD COLUMN d INT
  258. statement ok
  259. CREATE VIEW v AS SELECT x, y FROM t WHERE e > 5
  260. statement error cannot drop column "x" because view "v" depends on it
  261. ALTER TABLE t DROP COLUMN x
  262. statement error cannot drop column "y" because view "v" depends on it
  263. ALTER TABLE t DROP COLUMN y
  264. statement error cannot drop column "e" because view "v" depends on it
  265. ALTER TABLE t DROP COLUMN e
  266. # TODO(knz): this statement should succeed after cockroach#17269 is fixed.
  267. statement error cannot drop column "d" because view "v" depends on it
  268. ALTER TABLE t DROP COLUMN d
  269. # TODO(knz): remove the following once the test above succeeds.
  270. statement ok
  271. ALTER TABLE t DROP COLUMN d CASCADE
  272. statement ok
  273. ALTER TABLE t DROP COLUMN e CASCADE
  274. statement ok
  275. ALTER TABLE t ADD COLUMN e INT
  276. statement ok
  277. CREATE VIEW v AS SELECT x, y FROM t WHERE e > 5
  278. statement ok
  279. ALTER TABLE t DROP COLUMN IF EXISTS q
  280. statement error cannot drop column "e" because view "v" depends on it
  281. ALTER TABLE t DROP COLUMN IF EXISTS e
  282. statement ok
  283. ALTER TABLE t DROP COLUMN IF EXISTS e CASCADE
  284. statement ok
  285. ALTER TABLE t ADD COLUMN g INT UNIQUE
  286. statement ok
  287. CREATE TABLE o (gf INT REFERENCES t (g), h INT, i INT, INDEX ii (i) STORING(h))
  288. statement error "t_g_key" is referenced by foreign key from table "o"
  289. ALTER TABLE t DROP COLUMN g
  290. statement ok
  291. ALTER TABLE t DROP COLUMN g CASCADE
  292. statement error column "h" is referenced by existing index "ii"
  293. ALTER TABLE o DROP COLUMN h
  294. statement ok
  295. ALTER TABLE o DROP COLUMN h CASCADE
  296. statement ok
  297. ALTER TABLE t ADD f INT CHECK (f > 1)
  298. statement ok
  299. ALTER TABLE t ADD g INT DEFAULT 1 CHECK (g > 0)
  300. statement ok
  301. ALTER TABLE t ADD h INT CHECK (h > 0) CHECK (h < 10) UNIQUE
  302. statement error pq: validation of CHECK "i < 0" failed on row:.* i=1
  303. ALTER TABLE t ADD i INT DEFAULT 1 CHECK (i < 0)
  304. statement error pq: validation of CHECK "i < g" failed on row:.* g=1.* i=1
  305. ALTER TABLE t ADD i INT DEFAULT 1 CHECK (i < g)
  306. statement error pq: validation of CHECK "i > 0" failed on row:.* g=1.* i=0
  307. ALTER TABLE t ADD i INT AS (g - 1) STORED CHECK (i > 0)
  308. statement error adding a REFERENCES constraint while also adding a column via ALTER not supported
  309. ALTER TABLE t ADD f INT UNIQUE REFERENCES other
  310. query TTTTB
  311. SHOW CONSTRAINTS FROM t
  312. ----
  313. t check_f CHECK CHECK (f > 1) true
  314. t check_g CHECK CHECK (g > 0) true
  315. t check_h CHECK CHECK (h > 0) true
  316. t check_h1 CHECK CHECK (h < 10) true
  317. t primary PRIMARY KEY PRIMARY KEY (a ASC) true
  318. t t_h_key UNIQUE UNIQUE (h ASC) true
  319. statement ok
  320. DROP TABLE t
  321. # Test that more than one column with constraints can be added in the same
  322. # statement. The constraints added here are on columns that are new and both
  323. # columns and constraints run through the schema change process together.
  324. statement ok
  325. CREATE TABLE t (a INT PRIMARY KEY)
  326. statement ok
  327. INSERT INTO t VALUES (1)
  328. # Check references column added in same statement
  329. statement ok
  330. ALTER TABLE t ADD b INT DEFAULT 1, ADD c INT DEFAULT 2 CHECK (c > b)
  331. statement ok
  332. ALTER TABLE t ADD d INT UNIQUE, ADD e INT UNIQUE, ADD f INT
  333. # Check references column added in same statement
  334. statement error pq: validation of CHECK "g = h" failed on row:.* g=3.* h=2
  335. ALTER TABLE t ADD g INT DEFAULT 3, ADD h INT DEFAULT 2 CHECK (g = h)
  336. # Multiple unique columns can be added, followed by other commands (cockroach#35011)
  337. statement ok
  338. ALTER TABLE t ADD COLUMN u INT UNIQUE, ADD COLUMN v INT UNIQUE, ADD CONSTRAINT ck CHECK (a > 0);
  339. query TTTTB
  340. SHOW CONSTRAINTS FROM t
  341. ----
  342. t check_c_b CHECK CHECK (c > b) true
  343. t ck CHECK CHECK (a > 0) true
  344. t primary PRIMARY KEY PRIMARY KEY (a ASC) true
  345. t t_d_key UNIQUE UNIQUE (d ASC) true
  346. t t_e_key UNIQUE UNIQUE (e ASC) true
  347. t t_u_key UNIQUE UNIQUE (u ASC) true
  348. t t_v_key UNIQUE UNIQUE (v ASC) true
  349. statement ok
  350. DROP TABLE t
  351. # Subsequent operations succeed because the table is empty
  352. statement ok
  353. CREATE TABLE tt (a INT PRIMARY KEY)
  354. statement ok
  355. ALTER TABLE tt ADD COLUMN q DECIMAL NOT NULL
  356. statement ok
  357. ALTER table tt ADD COLUMN r DECIMAL
  358. # Ensure that a UNIQUE NOT NULL COLUMN can be added when there is no data in
  359. # the table.
  360. statement ok
  361. ALTER TABLE tt ADD COLUMN s DECIMAL UNIQUE NOT NULL
  362. statement ok
  363. ALTER TABLE tt ADD t DECIMAL UNIQUE DEFAULT 4.0
  364. query TTBTTTB colnames
  365. SHOW COLUMNS FROM tt
  366. ----
  367. column_name data_type is_nullable column_default generation_expression indices is_hidden
  368. a INT8 false NULL · {primary,tt_s_key,tt_t_key} false
  369. q DECIMAL false NULL · {} false
  370. r DECIMAL true NULL · {} false
  371. s DECIMAL false NULL · {tt_s_key} false
  372. t DECIMAL true 4.0:::DECIMAL · {tt_t_key} false
  373. # Default values can be added and changed after table creation.
  374. statement ok
  375. CREATE TABLE add_default (a int primary key, b int not null)
  376. statement error null value in column "b" violates not-null constraint
  377. INSERT INTO add_default (a) VALUES (1)
  378. statement ok
  379. ALTER TABLE add_default ALTER COLUMN b SET DEFAULT 42
  380. statement ok
  381. INSERT INTO add_default (a) VALUES (2)
  382. statement ok
  383. ALTER TABLE add_default ALTER COLUMN b SET DEFAULT 10
  384. statement ok
  385. INSERT INTO add_default (a) VALUES (3)
  386. statement error could not parse "foo" as type int
  387. ALTER TABLE add_default ALTER COLUMN b SET DEFAULT 'foo'
  388. statement error variable sub-expressions are not allowed in DEFAULT
  389. ALTER TABLE add_default ALTER COLUMN b SET DEFAULT c
  390. statement error variable sub-expressions are not allowed in DEFAULT
  391. ALTER TABLE add_default ALTER COLUMN b SET DEFAULT (SELECT 1)
  392. statement ok
  393. ALTER TABLE add_default ALTER COLUMN b DROP DEFAULT
  394. statement error null value in column "b" violates not-null constraint
  395. INSERT INTO add_default (a) VALUES (4)
  396. statement ok
  397. ALTER TABLE add_default ALTER COLUMN b SET DEFAULT NULL
  398. statement error null value in column "b" violates not-null constraint
  399. INSERT INTO add_default (a) VALUES (4)
  400. # Each row gets the default value from the time it was inserted.
  401. query II rowsort
  402. SELECT * FROM add_default
  403. ----
  404. 2 42
  405. 3 10
  406. statement ok
  407. ALTER TABLE add_default ALTER b DROP NOT NULL
  408. statement ok
  409. INSERT INTO add_default (a) VALUES (5)
  410. query II
  411. SELECT * from add_default WHERE a=5
  412. ----
  413. 5 NULL
  414. # Add a column with a default current_timestamp()
  415. statement ok
  416. ALTER TABLE add_default ADD COLUMN c TIMESTAMP DEFAULT current_timestamp()
  417. query II rowsort
  418. SELECT a,b FROM add_default WHERE current_timestamp > c AND current_timestamp() - c < interval '10s'
  419. ----
  420. 2 42
  421. 3 10
  422. 5 NULL
  423. # Add a column with a default transaction_timestamp()
  424. statement ok
  425. ALTER TABLE add_default ADD COLUMN d TIMESTAMP DEFAULT transaction_timestamp()
  426. query II rowsort
  427. SELECT a,b FROM add_default WHERE d > c AND d - c < interval '10s'
  428. ----
  429. 2 42
  430. 3 10
  431. 5 NULL
  432. # Add a column with a default statement_timestamp()
  433. statement ok
  434. ALTER TABLE add_default ADD COLUMN e TIMESTAMP DEFAULT statement_timestamp()
  435. query II rowsort
  436. SELECT a,b FROM add_default WHERE e > d AND e - d < interval '10s'
  437. ----
  438. 2 42
  439. 3 10
  440. 5 NULL
  441. # Add a column with a null-default statement_timestamp()
  442. statement ok
  443. ALTER TABLE add_default ADD COLUMN f TIMESTAMP DEFAULT NULL
  444. query IIS rowsort
  445. SELECT a,b,f FROM add_default
  446. ----
  447. 2 42 NULL
  448. 3 10 NULL
  449. 5 NULL NULL
  450. # Adding a unique column to an existing table with data with a default value
  451. # is illegal
  452. statement error pgcode 23505 violates unique constraint \"add_default_g_key\"
  453. ALTER TABLE add_default ADD g INT UNIQUE DEFAULT 1
  454. # various default evaluation errors
  455. statement ok
  456. CREATE SEQUENCE initial_seq
  457. statement error cannot backfill such sequence operation
  458. ALTER TABLE add_default ADD g INT DEFAULT nextval('initial_seq')
  459. statement error cannot backfill such evaluated expression
  460. ALTER TABLE add_default ADD g OID DEFAULT 'foo'::regclass::oid
  461. statement error cannot access virtual schema in anonymous database
  462. ALTER TABLE add_default ADD g INT DEFAULT 'foo'::regtype::INT
  463. subtest 26422
  464. statement ok
  465. BEGIN
  466. statement ok
  467. ALTER TABLE add_default ADD fee FLOAT NOT NULL DEFAULT 2.99
  468. statement ok
  469. ALTER TABLE add_default ALTER COLUMN fee DROP DEFAULT
  470. statement error pgcode XXA00 null value in column "fee" violates not-null constraint
  471. COMMIT
  472. statement error pgcode 42703 column "fee" does not exist
  473. ALTER TABLE add_default DROP fee
  474. # Multiple columns can be added at once with heterogeneous DEFAULT usage
  475. statement ok
  476. CREATE TABLE d (a INT PRIMARY KEY)
  477. statement ok
  478. INSERT INTO d VALUES (1), (2)
  479. statement ok
  480. ALTER TABLE d ADD COLUMN c INT, ADD COLUMN b INT DEFAULT 7
  481. statement ok
  482. INSERT INTO d (a, c) VALUES (3, 4)
  483. query III rowsort
  484. SELECT * FROM d
  485. ----
  486. 1 NULL 7
  487. 2 NULL 7
  488. 3 4 7
  489. # Test privileges.
  490. statement ok
  491. CREATE TABLE privs (a INT PRIMARY KEY, b INT)
  492. statement ok
  493. INSERT INTO privs VALUES (1)
  494. user testuser
  495. query T
  496. SHOW DATABASE
  497. ----
  498. test
  499. statement error user testuser does not have CREATE privilege on relation privs
  500. ALTER TABLE privs ADD c INT
  501. statement error user testuser does not have CREATE privilege on relation privs
  502. ALTER TABLE privs ADD CONSTRAINT foo UNIQUE (b)
  503. user root
  504. query TTBTTTB colnames
  505. SHOW COLUMNS FROM privs
  506. ----
  507. column_name data_type is_nullable column_default generation_expression indices is_hidden
  508. a INT8 false NULL · {primary} false
  509. b INT8 true NULL · {} false
  510. statement ok
  511. GRANT CREATE ON privs TO testuser
  512. user testuser
  513. statement ok
  514. ALTER TABLE privs ADD c INT
  515. statement ok
  516. ALTER TABLE privs ADD CONSTRAINT foo UNIQUE (b)
  517. query TTBTTTB colnames
  518. SHOW COLUMNS FROM privs
  519. ----
  520. column_name data_type is_nullable column_default generation_expression indices is_hidden
  521. a INT8 false NULL · {primary,foo} false
  522. b INT8 true NULL · {foo} false
  523. c INT8 true NULL · {} false
  524. statement error pgcode 42P01 relation "nonexistent" does not exist
  525. ALTER TABLE nonexistent SPLIT AT VALUES (42)
  526. statement error pgcode 42P01 relation "nonexistent" does not exist
  527. ALTER INDEX nonexistent@noindex SPLIT AT VALUES (42)
  528. statement error pgcode 42P01 relation "nonexistent" does not exist
  529. ALTER TABLE nonexistent UNSPLIT AT VALUES (42)
  530. statement error pgcode 42P01 relation "nonexistent" does not exist
  531. ALTER INDEX nonexistent@noindex UNSPLIT AT VALUES (42)
  532. user root
  533. statement ok
  534. CREATE VIEW privsview AS SELECT a,b,c FROM privs
  535. statement error pgcode 42809 "privsview" is not a table
  536. ALTER TABLE privsview ADD d INT
  537. statement error pgcode 42809 "privsview" is not a table
  538. ALTER TABLE privsview SPLIT AT VALUES (42)
  539. statement error pgcode 42809 "privsview" is not a table
  540. ALTER TABLE privsview UNSPLIT AT VALUES (42)
  541. # Verify that impure defaults are evaluated separately on each row
  542. # (database-issues#4105)
  543. statement ok
  544. CREATE TABLE impure (x INT); INSERT INTO impure(x) VALUES (1), (2), (3);
  545. statement ok
  546. ALTER TABLE impure ADD COLUMN a INT DEFAULT unique_rowid();
  547. query I
  548. SELECT count(distinct a) FROM impure
  549. ----
  550. 3
  551. # No orphaned schema change jobs.
  552. query I
  553. SELECT count(*) FROM crdb_internal.jobs
  554. WHERE job_type = 'SCHEMA CHANGE' AND status = 'pending' OR status = 'started'
  555. ----
  556. 0
  557. # Verify that ALTER TABLE statements are rolled back properly when a DEFAULT expression returns
  558. # an error.
  559. statement ok
  560. CREATE TABLE default_err_test (foo text)
  561. statement ok
  562. INSERT INTO default_err_test VALUES ('foo'), ('bar'), ('baz')
  563. statement error some_msg
  564. ALTER TABLE default_err_test ADD COLUMN id int DEFAULT crdb_internal.force_error('foo', 'some_msg')
  565. query T
  566. SELECT * from default_err_test ORDER BY foo
  567. ----
  568. bar
  569. baz
  570. foo
  571. # Create a table with a computed column that we'll de-compute
  572. statement ok
  573. CREATE TABLE decomputed_column (a INT PRIMARY KEY, b INT AS ( a + 1 ) STORED)
  574. statement ok
  575. INSERT INTO decomputed_column VALUES (1), (2)
  576. statement error cannot write directly to computed column
  577. INSERT INTO decomputed_column VALUES (3, NULL), (4, 99)
  578. statement ok
  579. ALTER TABLE decomputed_column ALTER COLUMN b DROP STORED
  580. statement error pq: column "a" is not a computed column
  581. ALTER TABLE decomputed_column ALTER COLUMN a DROP STORED
  582. statement error pq: column "b" is not a computed column
  583. ALTER TABLE decomputed_column ALTER COLUMN b DROP STORED
  584. # Verify that the computation is dropped and that we can mutate the column
  585. statement ok
  586. INSERT INTO decomputed_column VALUES (3, NULL), (4, 99)
  587. query II
  588. select a, b from decomputed_column order by a
  589. ----
  590. 1 2
  591. 2 3
  592. 3 NULL
  593. 4 99
  594. query TT
  595. show create table decomputed_column
  596. ----
  597. decomputed_column CREATE TABLE decomputed_column (
  598. a INT8 NOT NULL,
  599. b INT8 NULL,
  600. CONSTRAINT "primary" PRIMARY KEY (a ASC),
  601. FAMILY "primary" (a, b)
  602. )
  603. # Test for https://github.com/cockroachdb/cockroach/issues/26483
  604. # We try to create a unique column on an un-indexable type.
  605. statement ok
  606. CREATE TABLE b26483()
  607. statement error unimplemented: column c is of type int\[\] and thus is not indexable
  608. ALTER TABLE b26483 ADD COLUMN c INT[] UNIQUE
  609. # As above, but performed in a transaction
  610. statement ok
  611. BEGIN
  612. statement ok
  613. CREATE TABLE b26483_tx()
  614. statement ok
  615. ALTER TABLE b26483_tx ADD COLUMN c INT[]
  616. statement error unimplemented: column c is of type int\[\] and thus is not indexable
  617. CREATE INDEX on b26483_tx (c)
  618. statement ok
  619. ROLLBACK
  620. # Verify that auditing can be enabled by root, and cannot be disabled by non-root.
  621. statement ok
  622. CREATE TABLE audit(x INT); ALTER TABLE audit EXPERIMENTAL_AUDIT SET READ WRITE;
  623. # The user must be able to issue ALTER for this test to be meaningful.
  624. statement ok
  625. GRANT CREATE ON audit TO testuser
  626. user testuser
  627. # Check the user can indeed change the table
  628. statement ok
  629. ALTER TABLE audit ADD COLUMN y INT
  630. # But not the audit settings.
  631. statement error change auditing settings on a table
  632. ALTER TABLE audit EXPERIMENTAL_AUDIT SET OFF;
  633. user root
  634. # Check column backfill in the presence of fks
  635. subtest 27402
  636. statement ok
  637. CREATE TABLE users (
  638. id INT NOT NULL,
  639. city STRING NOT NULL,
  640. name STRING NULL,
  641. CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC)
  642. )
  643. statement ok
  644. CREATE TABLE vehicles (
  645. id INT NOT NULL,
  646. city STRING NOT NULL,
  647. type STRING NULL,
  648. owner_id INT NULL,
  649. mycol STRING NULL,
  650. CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC),
  651. INDEX vehicles_auto_index_fk_city_ref_users (city ASC, owner_id ASC)
  652. )
  653. statement ok
  654. CREATE TABLE rides (
  655. id INT NOT NULL,
  656. city STRING NOT NULL,
  657. vehicle_city STRING NULL,
  658. rider_id INT NULL,
  659. vehicle_id INT NULL,
  660. CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC),
  661. INDEX rides_auto_index_fk_city_ref_users (city ASC, rider_id ASC),
  662. INDEX rides_auto_index_fk_vehicle_city_ref_vehicles (vehicle_city ASC, vehicle_id ASC),
  663. CONSTRAINT check_vehicle_city_city CHECK (vehicle_city = city)
  664. )
  665. statement ok
  666. ALTER TABLE vehicles ADD CONSTRAINT fk_city_ref_users FOREIGN KEY (city, owner_id) REFERENCES users (city, id)
  667. statement ok
  668. ALTER TABLE rides ADD CONSTRAINT fk_city_ref_users FOREIGN KEY (city, rider_id) REFERENCES users (city, id)
  669. statement ok
  670. ALTER TABLE rides ADD CONSTRAINT fk_vehicle_city_ref_vehicles FOREIGN KEY (vehicle_city, vehicle_id) REFERENCES vehicles (city, id)
  671. statement ok
  672. INSERT INTO users VALUES (10, 'lagos', 'chimamanda')
  673. statement ok
  674. INSERT INTO vehicles VALUES (100, 'lagos', 'toyota', 10, 'mycol')
  675. statement ok
  676. INSERT INTO rides VALUES (567, 'lagos', 'lagos', 10, 100)
  677. statement ok
  678. ALTER TABLE vehicles DROP COLUMN mycol;
  679. # check that adding a reference on a column still being backfilled fails.
  680. # fix through cockroach#32917
  681. statement ok
  682. CREATE TABLE t32917 (a INT PRIMARY KEY)
  683. statement ok
  684. INSERT INTO t32917 VALUES (1), (2), (3)
  685. statement ok
  686. CREATE TABLE t32917_2 (b INT PRIMARY KEY)
  687. statement ok
  688. INSERT INTO t32917_2 VALUES (1), (2), (3)
  689. statement ok
  690. BEGIN
  691. statement ok
  692. ALTER TABLE t32917_2 ADD c INT UNIQUE DEFAULT 4
  693. statement error adding a REFERENCES constraint while the column is being added not supported
  694. ALTER TABLE t32917_2 ADD CONSTRAINT fk_c_a FOREIGN KEY (c) references t32917 (a)
  695. statement ok
  696. ROLLBACK