# LogicTest: local

# Ensure we can run DELETE statement on system.statement_statistics and
# system.transaction_statistics table.
statement ok
INSERT INTO system.users VALUES ('node', NULL, true, 3);

statement ok
GRANT node TO root;

# Constructing TIMESTAMPTZ expression that can be used later in the queries.
let $last_agg_ts
SELECT concat('''', date_trunc('hour', '2022-05-04 16:10'::TIMESTAMPTZ - '2h'::INTERVAL)::STRING, '''::TIMESTAMPTZ')

let $current_agg_ts
SELECT concat('''', date_trunc('hour', '2022-05-04 16:10'::TIMESTAMPTZ)::STRING, '''::TIMESTAMPTZ')

statement ok
DELETE FROM system.table_statistics WHERE true;


statement ok
ALTER TABLE system.statement_statistics INJECT STATISTICS '[
    {
        "columns": [
            "aggregated_ts"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "histo_col_type": "TIMESTAMPTZ",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "fingerprint_id",
            "transaction_fingerprint_id",
            "plan_hash",
            "app_name",
            "node_id",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "fingerprint_id",
            "transaction_fingerprint_id",
            "plan_hash",
            "app_name",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "fingerprint_id",
            "transaction_fingerprint_id",
            "plan_hash",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "fingerprint_id",
            "transaction_fingerprint_id",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "fingerprint_id",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "app_name"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "fingerprint_id"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "histo_col_type": "BYTES",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "fingerprint_id",
            "transaction_fingerprint_id"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "transaction_fingerprint_id"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "histo_col_type": "BYTES",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "plan_hash"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "histo_col_type": "BYTES",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "app_name"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "histo_col_type": "STRING",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "node_id"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "histo_col_type": "INT8",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "agg_interval"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "histo_col_type": "INTERVAL",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "metadata"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "statistics"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8"
        ],
        "created_at": "2023-03-24 21:22:03.381873",
        "distinct_count": 1000000,
        "histo_col_type": "INT4",
        "null_count": 0,
        "row_count": 1000000
    }
]'

query T
EXPLAIN (VERBOSE)
DELETE FROM system.statement_statistics
WHERE crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8 = 0
  AND aggregated_ts < $current_agg_ts
ORDER BY aggregated_ts ASC
LIMIT 1024
RETURNING aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id
----
distribution: local
vectorized: true
·
• project
│ columns: (aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id)
│
└── • delete
    │ columns: (aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8)
    │ estimated row count: 0
    │ from: statement_statistics
    │ auto commit
    │
    └── • project
        │ columns: (aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8, indexes_usage, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1)
        │
        └── • render
            │ columns: (partial_index_del1, indexes_usage, aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency)
            │ render partial_index_del1: app_name NOT LIKE '$ internal%'
            │ render indexes_usage: (statistics->'statistics')->'indexes'
            │ render aggregated_ts: aggregated_ts
            │ render fingerprint_id: fingerprint_id
            │ render transaction_fingerprint_id: transaction_fingerprint_id
            │ render plan_hash: plan_hash
            │ render app_name: app_name
            │ render node_id: node_id
            │ render crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8: crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8
            │ render execution_count: execution_count
            │ render service_latency: service_latency
            │ render cpu_sql_nanos: cpu_sql_nanos
            │ render contention_time: contention_time
            │ render total_estimated_execution_time: total_estimated_execution_time
            │ render p99_latency: p99_latency
            │
            └── • scan
                  columns: (aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id, statistics, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency)
                  estimated row count: 0 (<0.01% of the table; stats collected <hidden> ago)
                  table: statement_statistics@primary
                  spans: /0-/0/2022-05-04T15:59:59.999999001Z
                  limit: 1024
                  locking strength: for update

statement ok
ALTER TABLE system.transaction_statistics INJECT STATISTICS '[
    {
        "columns": [
            "aggregated_ts"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "histo_col_type": "TIMESTAMPTZ",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "fingerprint_id",
            "app_name",
            "node_id",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "fingerprint_id",
            "app_name",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "fingerprint_id",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "app_name"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "aggregated_ts",
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "fingerprint_id"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "histo_col_type": "BYTES",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "app_name"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "histo_col_type": "STRING",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "node_id"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "histo_col_type": "INT8",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "agg_interval"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "histo_col_type": "INTERVAL",
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "metadata"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "statistics"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "null_count": 0,
        "row_count": 1000000
    },
    {
        "columns": [
            "crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8"
        ],
        "created_at": "2023-03-24 21:14:26.994348",
        "distinct_count": 1000000,
        "histo_col_type": "INT4",
        "null_count": 0,
        "row_count": 1000000
    }
]'

query T
EXPLAIN (VERBOSE)
DELETE FROM system.transaction_statistics
  WHERE crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8 = 0
    AND aggregated_ts < $current_agg_ts
  ORDER BY aggregated_ts ASC
  LIMIT 1024
 RETURNING aggregated_ts, fingerprint_id, app_name, node_id
----
distribution: local
vectorized: true
·
• project
│ columns: (aggregated_ts, fingerprint_id, app_name, node_id)
│
└── • delete
    │ columns: (aggregated_ts, fingerprint_id, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8)
    │ estimated row count: 0
    │ from: transaction_statistics
    │ auto commit
    │
    └── • project
        │ columns: (aggregated_ts, fingerprint_id, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1)
        │
        └── • render
            │ columns: (partial_index_del1, aggregated_ts, fingerprint_id, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency)
            │ render partial_index_del1: app_name NOT LIKE '$ internal%'
            │ render aggregated_ts: aggregated_ts
            │ render fingerprint_id: fingerprint_id
            │ render app_name: app_name
            │ render node_id: node_id
            │ render crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8: crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8
            │ render execution_count: execution_count
            │ render service_latency: service_latency
            │ render cpu_sql_nanos: cpu_sql_nanos
            │ render contention_time: contention_time
            │ render total_estimated_execution_time: total_estimated_execution_time
            │ render p99_latency: p99_latency
            │
            └── • scan
                  columns: (aggregated_ts, fingerprint_id, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency)
                  estimated row count: 0 (<0.01% of the table; stats collected <hidden> ago)
                  table: transaction_statistics@primary
                  spans: /0-/0/2022-05-04T15:59:59.999999001Z
                  limit: 1024
                  locking strength: for update

query T
EXPLAIN (VERBOSE)
DELETE FROM system.statement_statistics
WHERE crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8 = 0
AND (
  (
    aggregated_ts,
    fingerprint_id,
    transaction_fingerprint_id,
    plan_hash,
    app_name,
    node_id
    ) >= ($last_agg_ts, b'123', b'234', b'345', 'test', 1)
  )
    AND aggregated_ts < $current_agg_ts
  ORDER BY aggregated_ts ASC
  LIMIT 1024
 RETURNING aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id
----
distribution: local
vectorized: true
·
• project
│ columns: (aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id)
│
└── • delete
    │ columns: (aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8)
    │ estimated row count: 0
    │ from: statement_statistics
    │ auto commit
    │
    └── • project
        │ columns: (aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8, indexes_usage, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1)
        │
        └── • render
            │ columns: (partial_index_del1, indexes_usage, aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency)
            │ render partial_index_del1: app_name NOT LIKE '$ internal%'
            │ render indexes_usage: (statistics->'statistics')->'indexes'
            │ render aggregated_ts: aggregated_ts
            │ render fingerprint_id: fingerprint_id
            │ render transaction_fingerprint_id: transaction_fingerprint_id
            │ render plan_hash: plan_hash
            │ render app_name: app_name
            │ render node_id: node_id
            │ render crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8: crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8
            │ render execution_count: execution_count
            │ render service_latency: service_latency
            │ render cpu_sql_nanos: cpu_sql_nanos
            │ render contention_time: contention_time
            │ render total_estimated_execution_time: total_estimated_execution_time
            │ render p99_latency: p99_latency
            │
            └── • scan
                  columns: (aggregated_ts, fingerprint_id, transaction_fingerprint_id, plan_hash, app_name, node_id, statistics, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_plan_hash_transaction_fingerprint_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency)
                  estimated row count: 0 (<0.01% of the table; stats collected <hidden> ago)
                  table: statement_statistics@primary
                  spans: /0/2022-05-04T14:00:00Z/"123"/"234"/"345"/"test"/1-/0/2022-05-04T15:59:59.999999001Z
                  limit: 1024
                  locking strength: for update

query T
EXPLAIN (VERBOSE)
DELETE FROM system.transaction_statistics
      WHERE crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8 = 0
      AND (
        (
        aggregated_ts,
        fingerprint_id,
        app_name,
        node_id
        ) >= ($last_agg_ts, b'123', 'test', 2)
      )
        AND aggregated_ts < $current_agg_ts
      ORDER BY aggregated_ts ASC
      LIMIT 1024
     RETURNING aggregated_ts, fingerprint_id, app_name, node_id
----
distribution: local
vectorized: true
·
• project
│ columns: (aggregated_ts, fingerprint_id, app_name, node_id)
│
└── • delete
    │ columns: (aggregated_ts, fingerprint_id, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8)
    │ estimated row count: 0
    │ from: transaction_statistics
    │ auto commit
    │
    └── • project
        │ columns: (aggregated_ts, fingerprint_id, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1, partial_index_del1)
        │
        └── • render
            │ columns: (partial_index_del1, aggregated_ts, fingerprint_id, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency)
            │ render partial_index_del1: app_name NOT LIKE '$ internal%'
            │ render aggregated_ts: aggregated_ts
            │ render fingerprint_id: fingerprint_id
            │ render app_name: app_name
            │ render node_id: node_id
            │ render crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8: crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8
            │ render execution_count: execution_count
            │ render service_latency: service_latency
            │ render cpu_sql_nanos: cpu_sql_nanos
            │ render contention_time: contention_time
            │ render total_estimated_execution_time: total_estimated_execution_time
            │ render p99_latency: p99_latency
            │
            └── • scan
                  columns: (aggregated_ts, fingerprint_id, app_name, node_id, crdb_internal_aggregated_ts_app_name_fingerprint_id_node_id_shard_8, execution_count, service_latency, cpu_sql_nanos, contention_time, total_estimated_execution_time, p99_latency)
                  estimated row count: 0 (<0.01% of the table; stats collected <hidden> ago)
                  table: transaction_statistics@primary
                  spans: /0/2022-05-04T14:00:00Z/"123"/"test"/2-/0/2022-05-04T15:59:59.999999001Z
                  limit: 1024
                  locking strength: for update

statement ok
RESET CLUSTER SETTING sql.stats.flush.interval

statement ok
REVOKE node FROM root;

statement ok
DELETE FROM system.users WHERE username = 'node';
