-- fire all kinds of queries and then check if those are present in the system.query_log
SET log_comment='system.query_log logging test';

SELECT 'DROP queries and also a cleanup before the test';
DROP DATABASE IF EXISTS sqllt;
DROP USER IF EXISTS sqllt_user;
DROP ROLE IF EXISTS sqllt_role;
DROP POLICY IF EXISTS sqllt_policy ON sqllt.table, sqllt.view, sqllt.dictionary;
DROP ROW POLICY IF EXISTS sqllt_row_policy ON sqllt.table, sqllt.view, sqllt.dictionary;
DROP QUOTA IF EXISTS sqllt_quota;
DROP SETTINGS PROFILE IF EXISTS sqllt_settings_profile;

SELECT 'CREATE queries';
CREATE DATABASE sqllt;
USE sqllt;

CREATE TABLE sqllt.table
(
    i UInt8, s String
)
ENGINE = MergeTree PARTITION BY tuple() ORDER BY tuple();

CREATE VIEW sqllt.view AS SELECT i, s FROM sqllt.table;
CREATE DICTIONARY sqllt.dictionary (key UInt64, value UInt64) PRIMARY KEY key SOURCE(CLICKHOUSE(DB 'sqllt' TABLE 'table' HOST 'localhost' PORT 9001)) LIFETIME(0) LAYOUT(FLAT());

CREATE USER sqllt_user IDENTIFIED WITH PLAINTEXT_PASSWORD BY 'password';
CREATE ROLE sqllt_role;

CREATE POLICY sqllt_policy ON sqllt.table, sqllt.view, sqllt.dictionary AS PERMISSIVE TO ALL;
CREATE POLICY sqllt_row_policy ON sqllt.table, sqllt.view, sqllt.dictionary AS PERMISSIVE TO ALL;

CREATE QUOTA sqllt_quota KEYED BY user_name TO sqllt_role;
CREATE SETTINGS PROFILE sqllt_settings_profile SETTINGS interactive_delay = 200000;

GRANT sqllt_role TO sqllt_user;


SELECT 'SET queries';
SET log_profile_events=false;
SET DEFAULT ROLE sqllt_role TO sqllt_user;
-- SET ROLE sqllt_role; -- tests are executed by user `default` which is defined in XML and is impossible to update.

SELECT 'ALTER TABLE queries';
ALTER TABLE table ADD COLUMN new_col UInt32 DEFAULT 123456789;
ALTER TABLE table COMMENT COLUMN new_col 'dummy column with a comment';
ALTER TABLE table CLEAR COLUMN new_col;
ALTER TABLE table MODIFY COLUMN new_col DateTime DEFAULT '2015-05-18 07:40:13';
ALTER TABLE table MODIFY COLUMN new_col REMOVE COMMENT;
ALTER TABLE table RENAME COLUMN new_col TO the_new_col;
ALTER TABLE table DROP COLUMN the_new_col;
ALTER TABLE table UPDATE i = i + 1 WHERE 1;
ALTER TABLE table DELETE WHERE i > 65535;

-- not done, seems to hard, so I've skipped queries of ALTER-X, where X is:
-- PARTITION
-- ORDER BY
-- SAMPLE BY
-- INDEX
-- CONSTRAINT
-- TTL
-- USER
-- QUOTA
-- ROLE
-- ROW POLICY
-- SETTINGS PROFILE

SELECT 'SYSTEM queries';
SYSTEM RELOAD EMBEDDED DICTIONARIES;
SYSTEM RELOAD DICTIONARIES;
SYSTEM DROP DNS CACHE;
SYSTEM DROP MARK CACHE;
SYSTEM DROP UNCOMPRESSED CACHE;
SYSTEM FLUSH LOGS;
SYSTEM RELOAD CONFIG;
SYSTEM STOP MERGES;
SYSTEM START MERGES;
SYSTEM STOP TTL MERGES;
SYSTEM START TTL MERGES;
SYSTEM STOP MOVES;
SYSTEM START MOVES;
SYSTEM STOP FETCHES;
SYSTEM START FETCHES;
SYSTEM STOP REPLICATED SENDS;
SYSTEM START REPLICATED SENDS;

-- SYSTEM RELOAD DICTIONARY sqllt.dictionary; -- temporary out of order: Code: 210, Connection refused (localhost:9001) (version 21.3.1.1)
-- DROP REPLICA
-- haha, no
-- SYSTEM KILL;
-- SYSTEM SHUTDOWN;

-- Since we don't really care about the actual output, suppress it with `FORMAT Null`.
SELECT 'SHOW queries';

SHOW CREATE TABLE sqllt.table FORMAT Null;
SHOW CREATE DICTIONARY sqllt.dictionary FORMAT Null;
SHOW DATABASES LIKE 'sqllt' FORMAT Null;
SHOW TABLES FROM sqllt FORMAT Null;
SHOW DICTIONARIES FROM sqllt FORMAT Null;
SHOW GRANTS FORMAT Null;
SHOW GRANTS FOR sqllt_user FORMAT Null;
SHOW CREATE USER sqllt_user FORMAT Null;
SHOW CREATE ROLE sqllt_role FORMAT Null;
SHOW CREATE POLICY sqllt_policy FORMAT Null;
SHOW CREATE ROW POLICY sqllt_row_policy FORMAT Null;
SHOW CREATE QUOTA sqllt_quota FORMAT Null;
SHOW CREATE SETTINGS PROFILE sqllt_settings_profile FORMAT Null;

SELECT 'GRANT queries';
GRANT SELECT ON sqllt.table TO sqllt_user;
GRANT DROP ON sqllt.view TO sqllt_user;

SELECT 'REVOKE queries';
REVOKE SELECT ON sqllt.table FROM sqllt_user;
REVOKE DROP ON sqllt.view FROM sqllt_user;

SELECT 'Misc queries';
DESCRIBE TABLE sqllt.table FORMAT Null;

CHECK TABLE sqllt.table FORMAT Null;
DETACH TABLE sqllt.table;
ATTACH TABLE sqllt.table;

RENAME TABLE sqllt.table TO sqllt.table_new;
RENAME TABLE sqllt.table_new TO sqllt.table;
TRUNCATE TABLE sqllt.table;

---------------------------------------------------------------------------------------------------
-- Now get all logs related to this test
---------------------------------------------------------------------------------------------------

SYSTEM FLUSH LOGS;
SELECT 'ACTUAL LOG CONTENT:';

-- Try to filter out all possible previous junk events by excluding old log entries,
SELECT query_kind, query FROM system.query_log
WHERE
    log_comment LIKE '%system.query_log%' AND type == 'QueryStart' AND query_start_time >= now() - 5
    -- this one is to make stylecheck happy and to validate that CREATE\DROP queries of non-db-bound-objects, like USER\ROLS are logged properly.
    AND (current_database == currentDatabase() OR current_database != currentDatabase())
ORDER BY query;


-- cleanup
SELECT 'DROP queries and also a cleanup after the test';
DROP DATABASE IF EXISTS sqllt;
DROP USER IF EXISTS sqllt_user;
DROP ROLE IF EXISTS sqllt_role;
DROP POLICY IF EXISTS sqllt_policy ON sqllt.table, sqllt.view, sqllt.dictionary;
DROP ROW POLICY IF EXISTS sqllt_row_policy ON sqllt.table, sqllt.view, sqllt.dictionary;
DROP QUOTA IF EXISTS sqllt_quota;
DROP SETTINGS PROFILE IF EXISTS sqllt_settings_profile;
