# LogicTest: local local-opt fakedist fakedist-opt fakedist-metadata

##################
# TABLE DDL
##################

# Create two tables + superfluous "IF NOT EXISTS"
##################

statement ok
CREATE TABLE a (id INT PRIMARY KEY)

statement ok
CREATE TABLE IF NOT EXISTS b (id INT PRIMARY KEY)

statement ok
CREATE TABLE IF NOT EXISTS a (id INT PRIMARY KEY)


# Verify that two create tables were logged - the second
# NOT EXISTS should not result in a log message.
##################

query IT rowsort
SELECT "reportingID", info::JSONB->>'TableName'
  FROM system.eventlog
 WHERE "eventType" = 'create_table'
----
1  test.public.a
1  test.public.b

# Verify the contents of the 'Info' field of each log message using a LIKE
# statement.
##################

query IT
SELECT "reportingID", info::JSONB->>'TableName'
FROM system.eventlog
WHERE "eventType" = 'create_table'
  AND info::JSONB->>'Statement' LIKE 'CREATE TABLE a%'
----
1  test.public.a

query IT
SELECT "reportingID", info::JSONB->>'TableName'
FROM system.eventlog
WHERE "eventType" = 'create_table'
  AND info::JSONB->>'Statement' LIKE 'CREATE TABLE IF NOT EXISTS b%'
----
1  test.public.b

# Sanity check - check for a non-matching info value.
##################

query I
SELECT count(*)
FROM system.eventlog
WHERE "eventType" = 'create_table'
  AND info LIKE '%CREATE TABLE badtable%'
----
0

# Alter the table. Expect "alter_table" and "finish_schema_change" events.
##################

query IT rowsort
SELECT "reportingID", info::JSONB->>'TableName' FROM system.eventlog
WHERE "eventType" = 'alter_table'
----

statement ok
ALTER TABLE a ADD val INT

query IT rowsort
SELECT "reportingID", info::JSONB->>'TableName' FROM system.eventlog
WHERE "eventType" = 'alter_table'
----
1  test.public.a

query IT rowsort
SELECT "reportingID", info::JSONB->>'MutationID' FROM system.eventlog
WHERE "eventType" = 'finish_schema_change'
----
1  1

query I
SELECT "reportingID" FROM system.eventlog
WHERE "eventType" = 'reverse_schema_change'
----

# Verify the contents of the 'Info' field of each log message using a LIKE
# statement.
##################
query IT
SELECT "reportingID", info::JSONB->>'TableName' FROM system.eventlog
WHERE "eventType" = 'alter_table'
  AND info::JSONB->>'Statement' LIKE 'ALTER TABLE a%'
----
1  test.public.a

# Add a UNIQUE constraint to the table in a way that will ensure the schema
# change is reversed.
##################

statement ok
INSERT INTO a VALUES (1, 1), (2, 1)

statement error pgcode 23505 violates unique constraint \"foo\"
ALTER TABLE a ADD CONSTRAINT foo UNIQUE(val)

query IT rowsort
SELECT "reportingID", info::JSONB->>'TableName' FROM system.eventlog
WHERE "eventType" = 'alter_table'
----
1  test.public.a
1  test.public.a

query IT rowsort
SELECT "reportingID", info::JSONB->>'MutationID'  FROM system.eventlog
WHERE "eventType" = 'finish_schema_change'
----
1  1

query IT rowsort
SELECT "reportingID", info::JSONB->>'MutationID' FROM system.eventlog
WHERE "eventType" = 'reverse_schema_change'
----
1  2


query IT rowsort
SELECT "reportingID", info::JSONB->>'MutationID' FROM system.eventlog
WHERE "eventType" = 'finish_schema_change_rollback'
----
1  2

# Create an Index on the table
#################

statement ok
CREATE INDEX a_foo ON a (val)

query ITT
SELECT "reportingID", info::JSONB->>'TableName', info::JSONB->>'IndexName' FROM system.eventlog
WHERE "eventType" = 'create_index'
  AND info::JSONB->>'Statement' LIKE 'CREATE INDEX a_foo%'
----
1  test.public.a  a_foo

query IT rowsort
SELECT "reportingID", info::JSONB->>'MutationID' FROM system.eventlog
WHERE "eventType" = 'finish_schema_change'
----
1  1
1  3

statement ok
CREATE INDEX ON a (val)

query ITT
SELECT "reportingID", info::JSONB->>'TableName', info::JSONB->>'IndexName' FROM system.eventlog
WHERE "eventType" = 'create_index'
  AND info::JSONB->>'Statement' LIKE 'CREATE INDEX ON%'
----
1  test.public.a  a_val_idx

query IT rowsort
SELECT "reportingID", info::JSONB->>'MutationID' FROM system.eventlog
WHERE "eventType" = 'finish_schema_change'
----
1  1
1  3
1  4


# Drop the index
#################

statement ok
DROP INDEX a@a_foo

query ITT
SELECT "reportingID", info::JSONB->>'TableName', info::JSONB->>'IndexName' FROM system.eventlog
WHERE "eventType" = 'drop_index'
  AND info::JSONB->>'Statement' LIKE 'DROP INDEX%a_foo'
----
1  test.public.a  a_foo

query IT rowsort
SELECT "reportingID", info::JSONB->>'MutationID' FROM system.eventlog
WHERE "eventType" = 'finish_schema_change'
----
1  1
1  3
1  4
1  5

# Truncate a table
##################

statement ok
TRUNCATE TABLE a

query IT rowsort
SELECT "reportingID", info::JSONB->>'TableName'
FROM system.eventlog
WHERE "eventType" = 'truncate_table'
----
1  test.public.a

# Drop both tables + superfluous "IF EXISTS"
##################

statement ok
DROP TABLE a

statement ok
DROP TABLE IF EXISTS b

statement ok
DROP TABLE IF EXISTS b


# Verify that two drop table events were logged - the second IF EXISTS statement
# should have failed.
##################

query IT rowsort
SELECT "reportingID", info::JSONB->>'TableName'
FROM system.eventlog
WHERE "eventType" = 'drop_table'
----
1  test.public.a
1  test.public.b

# Verify the contents of the 'info' field of each event.
##################

query IT
SELECT "reportingID", info::JSONB->>'TableName'
FROM system.eventlog
WHERE "eventType" = 'drop_table'
  AND info::JSONB->>'Statement' LIKE 'DROP TABLE a%'
----
1  test.public.a

query IT
SELECT "reportingID", info::JSONB->>'TableName'
FROM system.eventlog
WHERE "eventType" = 'drop_table'
  AND info::JSONB->>'Statement' LIKE 'DROP TABLE IF EXISTS b%'
----
1  test.public.b


##################
# DATABASE DDL
##################

# Create two databases + superfluous "IF NOT EXISTS"
##################

statement ok
CREATE DATABASE eventlogtest

statement ok
CREATE DATABASE IF NOT EXISTS othereventlogtest

statement ok
CREATE DATABASE IF NOT EXISTS othereventlogtest


# Verify the two events that were logged.
##################

query IT
SELECT "reportingID", info::JSONB->>'DatabaseName'
FROM system.eventlog
WHERE "eventType" = 'create_database'
  AND info::JSONB->>'Statement' LIKE 'CREATE DATABASE eventlogtest%'
----
1  eventlogtest

query IT
SELECT "reportingID", info::JSONB->>'DatabaseName'
FROM system.eventlog
WHERE "eventType" = 'create_database'
  AND info::JSONB->>'Statement' LIKE 'CREATE DATABASE IF NOT EXISTS othereventlogtest%'
----
1  othereventlogtest

# Add some tables to eventlogtest.
##################

statement ok
SET DATABASE = eventlogtest

statement ok
CREATE TABLE eventlogtest.testtable (id int PRIMARY KEY)

statement ok
CREATE TABLE eventlogtest.anothertesttable (id int PRIMARY KEY)

# drop both databases.
##################

statement ok
DROP DATABASE eventlogtest CASCADE

statement ok
DROP DATABASE IF EXISTS othereventlogtest CASCADE

statement ok
DROP DATABASE IF EXISTS othereventlogtest CASCADE

# verify contents of drop event
##################

# verify event is there, and cascading table drops are logged.

query IT
SELECT "reportingID", info::JSONB->>'DroppedSchemaObjects'
FROM system.eventlog
WHERE "eventType" = 'drop_database'
  AND info::JSONB->>'Statement' LIKE 'DROP DATABASE eventlogtest%'
----
1  ["eventlogtest.public.anothertesttable", "eventlogtest.public.testtable"]

query IT
SELECT "reportingID", info::JSONB->>'DroppedSchemaObjects'
FROM system.eventlog
WHERE "eventType" = 'drop_database'
  AND info::JSONB->>'Statement' LIKE 'DROP DATABASE IF EXISTS othereventlogtest%'
----
1  []

statement ok
SET DATABASE = test

##################
# Cluster Settings
##################

# Set and unset a cluster setting
##################

statement ok
SET CLUSTER SETTING kv.allocator.load_based_lease_rebalancing.enabled = false

statement ok
SET CLUSTER SETTING kv.allocator.load_based_lease_rebalancing.enabled = DEFAULT

statement ok
PREPARE set_setting AS SET CLUSTER SETTING cluster.organization = $1

statement ok
EXECUTE set_setting('some string')

# verify setting changes are logged
##################
query IIT
SELECT "targetID", "reportingID", "info"
FROM system.eventlog
WHERE "eventType" = 'set_cluster_setting'
AND info NOT LIKE '%version%' AND info NOT LIKE '%sql.defaults.distsql%' AND info NOT LIKE '%cluster.secret%'
AND info NOT LIKE '%sql.stats.automatic_collection.enabled%'
ORDER BY "timestamp"
----
0  1  {"SettingName":"diagnostics.reporting.enabled","Value":"true","User":"root"}
0  1  {"SettingName":"trace.debug.enable","Value":"false","User":"root"}
0  1  {"SettingName":"kv.range_merge.queue_enabled","Value":"false","User":"root"}
0  1  {"SettingName":"sql.stats.automatic_collection.min_stale_rows","Value":"5","User":"root"}
0  1  {"SettingName":"kv.allocator.load_based_lease_rebalancing.enabled","Value":"false","User":"root"}
0  1  {"SettingName":"kv.allocator.load_based_lease_rebalancing.enabled","Value":"DEFAULT","User":"root"}
0  1  {"SettingName":"cluster.organization","Value":"'some string'","User":"root"}

# Set and unset zone configs
##################

statement ok
CREATE TABLE a (id INT PRIMARY KEY)

statement ok
ALTER TABLE a CONFIGURE ZONE USING range_max_bytes = 67108865, range_min_bytes = 16777216

statement ok
ALTER TABLE a CONFIGURE ZONE DISCARD

# verify zone config changes are logged
##################
query IT
SELECT "reportingID", "info"
FROM system.eventlog
WHERE "eventType" = 'set_zone_config'
ORDER BY "timestamp"
----
1  {"Target":"test.a","Options":"range_max_bytes = 67108865, range_min_bytes = 16777216","User":"root"}

query IT
SELECT "reportingID", "info"
FROM system.eventlog
WHERE "eventType" = 'remove_zone_config'
ORDER BY "timestamp"
----
1  {"Target":"test.a","User":"root"}

statement ok
DROP TABLE a

# Sequences

statement ok
CREATE SEQUENCE s

statement ok
ALTER SEQUENCE s START 10

statement ok
DROP SEQUENCE s

query TIT rowsort
SELECT "eventType", "reportingID", info::JSONB->>'SequenceName'
  FROM system.eventlog
 WHERE "eventType" in ('create_sequence', 'alter_sequence', 'drop_sequence')
----
create_sequence  1  test.public.s
alter_sequence   1  test.public.s
drop_sequence    1  test.public.s

# Views

statement ok
CREATE VIEW v AS SELECT 1

statement ok
DROP VIEW v

query TIT rowsort
SELECT "eventType", "reportingID", info::JSONB->>'ViewName'
  FROM system.eventlog
 WHERE "eventType" in ('create_view', 'drop_view')
----
create_view  1  test.public.v
drop_view    1  test.public.v
