# LogicTest: local local-opt

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

statement ok
CREATE TABLE othertable (
   x INT,
   INDEX baw (x)
)

statement error index name "baw" is ambiguous
DROP INDEX baw

statement error index name "baw" is ambiguous
DROP INDEX IF EXISTS baw

statement ok
DROP TABLE othertable

statement ok
DROP INDEX baw

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

query TTBITTBB colnames
SHOW INDEXES FROM users
----
table_name  index_name  non_unique  seq_in_index  column_name  direction  storing  implicit
users       primary     false       1             id           ASC        false    false
users       foo         true        1             name         ASC        false    false
users       foo         true        2             id           ASC        false    true
users       bar         false       1             id           ASC        false    false
users       bar         false       2             name         ASC        false    false

statement error index "zap" does not exist
DROP INDEX users@zap

statement ok
DROP INDEX IF EXISTS users@zap

query TTBITTBB colnames
SHOW INDEXES FROM users
----
table_name  index_name  non_unique  seq_in_index  column_name  direction  storing  implicit
users       primary     false       1             id           ASC        false    false
users       foo         true        1             name         ASC        false    false
users       foo         true        2             id           ASC        false    true
users       bar         false       1             id           ASC        false    false
users       bar         false       2             name         ASC        false    false

# Also test that dropping with a non-existing index still drops 'foo'.

statement ok
DROP INDEX IF EXISTS users@foo, users@zap

query TTBITTBB colnames
SHOW INDEXES FROM users
----
table_name  index_name  non_unique  seq_in_index  column_name  direction  storing  implicit
users       primary     false       1             id           ASC        false    false
users       bar         false       1             id           ASC        false    false
users       bar         false       2             name         ASC        false    false

user testuser

statement error user testuser does not have CREATE privilege on relation users
DROP INDEX users@bar

user root

statement ok
GRANT CREATE ON TABLE users TO testuser

user testuser

statement error in use as unique constraint
DROP INDEX users@bar

statement error in use as unique constraint
DROP INDEX users@bar RESTRICT

statement ok
DROP INDEX users@bar CASCADE

query TTBITTBB colnames
SHOW INDEXES FROM users
----
table_name  index_name  non_unique  seq_in_index  column_name  direction  storing  implicit
users       primary     false       1             id           ASC        false    false

user root

query ITT rowsort
SELECT * FROM users
----
1 tom   cat
2 jerry rat

statement ok
CREATE INDEX foo ON users (name)

statement ok
CREATE INDEX bar ON users (title)

statement ok
CREATE INDEX baz ON users (name, title)

statement ok
DROP INDEX IF EXISTS users@invalid, users@baz

query TTBITTBB colnames
SHOW INDEXES FROM users
----
table_name  index_name  non_unique  seq_in_index  column_name  direction  storing  implicit
users       primary     false       1             id           ASC        false    false
users       foo         true        1             name         ASC        false    false
users       foo         true        2             id           ASC        false    true
users       bar         true        1             title        ASC        false    false
users       bar         true        2             id           ASC        false    true

statement ok
CREATE VIEW v AS SELECT name FROM users@{FORCE_INDEX=foo}

statement error cannot drop index "foo" because view "v" depends on it
DROP INDEX users@foo

statement ok
DROP INDEX users@bar

query TTBITTBB colnames
SHOW INDEXES FROM users
----
table_name  index_name  non_unique  seq_in_index  column_name  direction  storing  implicit
users       primary     false       1             id           ASC        false    false
users       foo         true        1             name         ASC        false    false
users       foo         true        2             id           ASC        false    true

statement ok
CREATE VIEW v2 AS SELECT name FROM v

query T
SHOW TABLES
----
users
v
v2

statement ok
GRANT ALL ON users to testuser

statement ok
GRANT ALL ON v to testuser

user testuser

statement error user testuser does not have DROP privilege on relation v2
DROP INDEX users@foo CASCADE

user root

statement ok
DROP INDEX users@foo CASCADE

query TTBITTBB colnames
SHOW INDEXES FROM users
----
table_name  index_name  non_unique  seq_in_index  column_name  direction  storing  implicit
users       primary     false       1             id           ASC        false    false

query T
SHOW TABLES
----
users

# Test the syntax without a '@'

statement ok
CREATE INDEX baz ON users (name)

# Also test that dropping with a non-existing index still drops 'baz'.

statement ok
DROP INDEX IF EXISTS baz, zap

query TTBITTBB colnames
SHOW INDEXES FROM users
----
table_name  index_name  non_unique  seq_in_index  column_name  direction  storing  implicit
users       primary     false       1             id           ASC        false    false

# Test that it still succeeds when an index does not exist.

statement ok
DROP INDEX IF EXISTS baz

# Test that presence of a view or sequence doesn't break DROP INDEX (#21834)

statement ok
CREATE DATABASE view_test

statement ok
SET DATABASE = view_test

statement ok
CREATE TABLE t (id INT)

statement ok
CREATE VIEW v AS SELECT id FROM t

statement error pgcode 42704 pq: index "nonexistent_index" does not exist
DROP INDEX nonexistent_index

statement ok
CREATE DATABASE sequence_test

statement ok
SET DATABASE = sequence_test

statement ok
CREATE SEQUENCE s

statement error pgcode 42704 pq: index "nonexistent_index" does not exist
DROP INDEX nonexistent_index
