statement ok
CREATE TABLE users (
  uid    INT PRIMARY KEY,
  name  VARCHAR NOT NULL,
  title VARCHAR,
  INDEX foo (name) STORING (title),
  UNIQUE INDEX bar (uid, name)
)

statement ok
INSERT INTO users VALUES (1, 'tom', 'cat'),(2, 'jerry', 'rat')

query ITT colnames,rowsort
SELECT * FROM users
----
uid name  title
1  tom   cat
2  jerry rat

statement error pq: column "name" of relation "users" already exists
ALTER TABLE users RENAME COLUMN title TO name

statement error pgcode 42601 empty column name
ALTER TABLE users RENAME COLUMN title TO ""

statement error pgcode 42703 column "ttle" does not exist
ALTER TABLE users RENAME COLUMN ttle TO species

statement error pgcode 42P01 relation "uses" does not exist
ALTER TABLE uses RENAME COLUMN title TO species

statement ok
ALTER TABLE IF EXISTS uses RENAME COLUMN title TO species

statement ok
ALTER TABLE users RENAME COLUMN uid TO id

statement ok
ALTER TABLE users RENAME COLUMN title TO species

query ITT colnames,rowsort
SELECT * FROM users
----
id name  species
1  tom   cat
2  jerry rat

user testuser

statement error pq: must be owner of table users or have CREATE privilege on table users
ALTER TABLE users RENAME COLUMN name TO username

user root

statement ok
GRANT CREATE ON TABLE users TO testuser

user testuser

statement ok
ALTER TABLE users RENAME COLUMN name TO username

user root

query ITT colnames,rowsort
SELECT * FROM users
----
id username  species
1  tom       cat
2  jerry     rat

# Renaming a column updates the column names in an index.
query TTBITTTBBBF colnames,rowsort
SHOW INDEXES FROM users
----
table_name  index_name  non_unique  seq_in_index  column_name  definition  direction  storing  implicit  visible  visibility
users       bar         false       1             id           id          ASC        false    false     true     1
users       bar         false       2             username     username    ASC        false    false     true     1
users       foo         true        1             username     username    ASC        false    false     true     1
users       foo         true        2             species      species     N/A        true     false     true     1
users       foo         true        3             id           id          ASC        false    true      true     1
users       users_pkey  false       1             id           id          ASC        false    false     true     1
users       users_pkey  false       2             username     username    N/A        true     false     true     1
users       users_pkey  false       3             species      species     N/A        true     false     true     1

statement ok
CREATE VIEW v1 AS SELECT id FROM users WHERE username = 'tom'

statement error cannot rename column "id" because view "v1" depends on it
ALTER TABLE users RENAME COLUMN id TO uid

statement error cannot rename column "username" because view "v1" depends on it
ALTER TABLE users RENAME COLUMN username TO name

# TODO(knz): restore test after #17269 / #10083 is fixed.
#statement ok
#ALTER TABLE users RENAME COLUMN species TO title

statement ok
CREATE VIEW v2 AS SELECT id from users

statement ok
DROP VIEW v1

statement error cannot rename column "id" because view "v2" depends on it
ALTER TABLE users RENAME COLUMN id TO uid

# TODO(knz): restore test after #17269 / #10083 is fixed.
# statement ok
# ALTER TABLE users RENAME COLUMN username TO name

statement ok
DROP VIEW v2

query T
SELECT column_name FROM [SHOW COLUMNS FROM users] ORDER BY column_name
----
id
species
username

statement ok
SET vectorize=on

query T
EXPLAIN ALTER TABLE users RENAME COLUMN species TO woo
----
distribution: local
vectorized: true
·
• alter table

statement ok
RESET vectorize

# Verify that EXPLAIN did not actually rename the column
query T
SELECT column_name FROM [SHOW COLUMNS FROM users] ORDER BY column_name
----
id
species
username

# Check that a column can be added and renamed in the same statement
statement ok
ALTER TABLE users RENAME COLUMN species TO species_old,
                  ADD COLUMN species STRING AS (species_old || ' woo') STORED

query T rowsort
SELECT species FROM users
----
cat woo
rat woo

# Test that renaming columns works inside transactions that create resources
# which reference those columns.

subtest rename_in_transaction

statement ok
CREATE TABLE foo (j INT);

statement ok
BEGIN;
    ALTER TABLE foo ADD CONSTRAINT check_not_negative CHECK (j >= 0);
    ALTER TABLE foo RENAME COLUMN j TO i;
COMMIT;

statement ok
BEGIN;
    ALTER TABLE foo ADD COLUMN k INT AS (i+1) STORED;
    ALTER TABLE foo RENAME COLUMN i TO j;
COMMIT;

statement ok
BEGIN;
    ALTER TABLE foo ALTER COLUMN j SET NOT NULL;
    ALTER TABLE foo RENAME COLUMN j TO i;
COMMIT;

statement ok
BEGIN;
    CREATE INDEX ON foo(i) WHERE i > 0;
    ALTER TABLE foo RENAME COLUMN i TO j;
COMMIT;

statement ok
INSERT INTO foo(j) VALUES (1);

query II
SELECT j, k FROM foo;
----
1  2
