# Disable SQL Stats flush to prevents stats from being cleared from the
# in-memory store.
# LogicTest: local 3node-tenant

statement ok
SET CLUSTER SETTING sql.stats.flush.enabled = false;

# Check that node_statement_statistics report per application

statement ok
SET application_name = hello

statement ok
SELECT 1

statement ok
SET application_name = world

statement ok
SELECT 2

query B rowsort
SELECT count > 0 FROM crdb_internal.node_statement_statistics WHERE application_name IN ('hello', 'world')
----
true
true
true

# Check that node_statement_statistics report per statement

statement ok
SET application_name = hello;

statement ok
SELECT 1

statement ok
SELECT 1,2

statement ok
SELECT 1

# reset for other tests.
statement ok
SET application_name = ''

query TB
SELECT key, count >= 1 FROM crdb_internal.node_statement_statistics WHERE application_name = 'hello' AND key LIKE 'SELECT%' ORDER BY key
----
SELECT _     true
SELECT _, _  true

# Check that multiple stmts in a simple query are executed as one txn.

statement ok
SET application_name = multi_stmts_test;

statement ok
select 1, 2; select 1, 2, 3; select 'ok'

statement ok
SET application_name = ''

query TTB
SELECT txn_fingerprint_id, key, implicit_txn FROM crdb_internal.node_statement_statistics WHERE application_name = 'multi_stmts_test' ORDER BY txn_fingerprint_id
----
11423158778792053189  SELECT _                  true
11423158778792053189  SELECT _, _               true
11423158778792053189  SELECT _, _, _            true
6692757627851618087   SET application_name = _  true

statement ok
CREATE TABLE test(x INT, y INT, z INT); INSERT INTO test(x, y, z) VALUES (0,0,0);

# Disable DistSQL for most statements, so that they don't get the "+" flag.
statement ok
SET distsql = off

statement ok
SET application_name = 'valuetest'

# Check that shortening goes through functions.

statement ok
SELECT sin(1.23)

# Check stats for query errors.
statement error cannot take square root
SELECT sqrt(-1.0)

# Check that shortened queries can use virtual tables.

statement ok
SELECT key FROM test.crdb_internal.node_statement_statistics

# Check that multi-value clauses are shortened.

statement ok
SELECT x FROM (VALUES (1,2,3), (4,5,6)) AS t(x)

statement ok
INSERT INTO test VALUES (1, 2, 3), (4, 5, 6)

# Check that the RHS of IN comparisons are shortened.

statement ok
SELECT x FROM test WHERE y IN (4, 5, 6, 7, 8)

statement ok
SELECT x FROM test WHERE y NOT IN (4, 5, 6, 7, 8)

# Check that a non-constant prevents shortening.

statement ok
SELECT x FROM test WHERE y IN (4, 5, 6+x, 7, 8)

# Check that tuples in other positions are not shortened.

statement ok
SELECT ROW(1,2,3,4,5) FROM test WHERE FALSE

# Make one query run in distsql mode to test the flag
# and flag combinations

statement ok
set distsql = on

statement ok
SELECT x FROM test WHERE y IN (4, 5, 6, 7, 8)

statement error division by zero
SELECT x FROM test WHERE y = 1/z

# Set a cluster setting to make it show up below. Which one is set
# does not matter.
statement ok
SET CLUSTER SETTING debug.panic_on_failed_assertions.enabled = true;

statement ok
RESET CLUSTER SETTING debug.panic_on_failed_assertions.enabled

statement ok
SHOW application_name

statement ok
SHOW CLUSTER SETTING debug.panic_on_failed_assertions.enabled

statement ok
SET application_name = '';

statement ok
RESET distsql

query TT colnames
SELECT key,flags
FROM test.crdb_internal.node_statement_statistics
WHERE application_name = 'valuetest' ORDER BY key, flags
----
key                                                                       flags
INSERT INTO test VALUES (_, __more__), (__more__)                         ·
SELECT (_, __more__) FROM test WHERE _                                    ·
SELECT key FROM test.crdb_internal.node_statement_statistics              ·
SELECT sin(_)                                                             ·
SELECT sqrt(_)                                                            ·
SELECT x FROM (VALUES (_, __more__), (__more__)) AS t (x)                 ·
SELECT x FROM test WHERE y = (_ / z)                                      +
SELECT x FROM test WHERE y IN (_, _, _ + x, _, _)                         ·
SELECT x FROM test WHERE y IN (_, __more__)                               +
SELECT x FROM test WHERE y NOT IN (_, __more__)                           ·
SET CLUSTER SETTING "debug.panic_on_failed_assertions.enabled" = DEFAULT  ·
SET CLUSTER SETTING "debug.panic_on_failed_assertions.enabled" = _        ·
SET application_name = _                                                  ·
SET distsql = "on"                                                        ·
SHOW CLUSTER SETTING "debug.panic_on_failed_assertions.enabled"           ·
SHOW application_name                                                     ·

# Check that the latency measurements looks reasonable, protecting
# against failure to measure (#22877).

# We use the keys left over by the two unary selects
# performed at the start of this test above.
#
# The latency metrics are expressed in seconds. Check that some time
# was consumed, but not so much to verify that the computation has not
# incorrectly overflowed.
query TBBBBB colnames,nosort
SELECT key,
       service_lat_avg > 0 and service_lat_avg < 10 as svc_ok,
       parse_lat_avg > 0   and parse_lat_avg < 11   as parse_ok,
       plan_lat_avg > 0    and plan_lat_avg < 10    as plan_ok,
       run_lat_avg > 0     and run_lat_avg < 10     as run_ok,
                           overhead_lat_avg < 10    as ovh_ok
  FROM crdb_internal.node_statement_statistics
 WHERE key = 'SELECT _'
----
key       svc_ok  parse_ok  plan_ok  run_ok  ovh_ok
SELECT _  true    true      true     true    true
SELECT _  true    true      true     true    true
SELECT _  true    true      true     true    true

# Check that statements made in implicit transactions are separated from those
# that are not.

statement ok
SET application_name = 'implicit_txn_test'

statement ok
BEGIN; SELECT x FROM test where y=1; COMMIT;

# Upgraded implicit txn.
statement ok
select 1; BEGIN; select 1; select 1; COMMIT

statement ok
BEGIN;
SELECT x, z FROM test;
SELECT x FROM test where y=1;
COMMIT;

statement ok
SELECT z FROM test where y=2;

statement ok
SELECT x FROM test where y=1;

query TB colnames
SELECT key, implicit_txn
  FROM crdb_internal.node_statement_statistics
 WHERE application_name = 'implicit_txn_test'
ORDER BY key, implicit_txn;
----
key                             implicit_txn
SELECT _                        false
SELECT _                        true
SELECT x FROM test WHERE y = _  false
SELECT x FROM test WHERE y = _  false
SELECT x FROM test WHERE y = _  true
SELECT x, z FROM test           false
SELECT z FROM test WHERE y = _  true

# Test throttling of storing statistics per application

# Creating some helper views.
statement ok
CREATE VIEW txn_fingerprint_view
AS SELECT
  key, statement_ids, count
FROM
  crdb_internal.node_transaction_statistics
WHERE application_name = 'throttle_test'
  AND statement_ids[1] in (
    SELECT
      statement_id
    FROM
      crdb_internal.node_statement_statistics
    WHERE
      key LIKE 'SELECT%'
  )

statement ok
CREATE VIEW app_stmts_view
AS SELECT statement_id, key, count
FROM crdb_internal.node_statement_statistics
WHERE application_name = 'throttle_test'

statement ok
SET application_name = throttle_test

# Create 3 distinct fingerprints.
statement ok
BEGIN; SELECT 1; SELECT 1, 2; SELECT 1, 2, 3; COMMIT

statement ok
BEGIN

query TTI
SELECT * FROM app_stmts_view ORDER BY 2
----
10543509969653713419  SELECT _        1
5745311157220589902  SELECT _, _     1
5153809228704478461  SELECT _, _, _  1

query TTI
SELECT * FROM txn_fingerprint_view
----
7184384531886178123  {10543509969653713419,5745311157220589902,5153809228704478461}  1

statement OK
COMMIT

# Change the limit for unique fingerprint.
statement ok
SET CLUSTER SETTING sql.metrics.max_mem_stmt_fingerprints = 0

statement ok
SET CLUSTER SETTING sql.metrics.max_mem_txn_fingerprints = 0

# We now have two additional statement fingerprints because of the two queries we ran against the crdb_internal view
# prior to setting the fingerprint limit to 0.
query TTI
SELECT * FROM app_stmts_view ORDER BY 2
----
7849245716382231737  SELECT * FROM app_stmts_view ORDER BY _  1
18313404398542206079    SELECT * FROM txn_fingerprint_view       1
10543509969653713419  SELECT _                                 1
5745311157220589902  SELECT _, _                              1
5153809228704478461  SELECT _, _, _                           1

query TTI rowsort
SELECT * FROM txn_fingerprint_view
----
7184384531886178123   {10543509969653713419,5745311157220589902,5153809228704478461}  1
18258640834625550893  {7849245716382231737,18313404398542206079}                         1

# Run more fingerprints to ensure that we are still updating our existing fingerprint but not creating more
# fingerprints.
statement ok
BEGIN; SELECT 1; SELECT 1, 3; SELECT 1, 2, 3; COMMIT

statement ok
BEGIN; SELECT 1; SELECT 1, 3; SELECT 1, 2, 3, 4; COMMIT

statement ok
BEGIN

query TTI
SELECT * FROM app_stmts_view ORDER BY 2
----
7849245716382231737  SELECT * FROM app_stmts_view ORDER BY _  1
18313404398542206079    SELECT * FROM txn_fingerprint_view       1
10543509969653713419  SELECT _                                 2
5745311157220589902  SELECT _, _                              2
5153809228704478461  SELECT _, _, _                           2

query TTI rowsort
SELECT * FROM txn_fingerprint_view
----
7184384531886178123   {10543509969653713419,5745311157220589902,5153809228704478461}  2
18258640834625550893  {7849245716382231737,18313404398542206079}                         1

statement ok
COMMIT

# Reset cluster setting for fingerprint limit.
statement ok
RESET CLUSTER SETTING sql.metrics.max_mem_stmt_fingerprints

statement ok
RESET CLUSTER SETTING sql.metrics.max_mem_txn_fingerprints

statement ok
BEGIN; SELECT 1; SELECT 1, 3; SELECT 1, 2, 3, 4; COMMIT

statement ok
BEGIN

query TTI
SELECT * FROM app_stmts_view ORDER BY 2
----
7849245716382231737  SELECT * FROM app_stmts_view ORDER BY _                                2
18313404398542206079    SELECT * FROM txn_fingerprint_view                                     2
10543509969653713419  SELECT _                                                               2
10543509969653713419  SELECT _                                                               1
5745311157220589902  SELECT _, _                                                            2
5745311157220589902  SELECT _, _                                                            1
5153809228704478461  SELECT _, _, _                                                         2
5323573557126703672  SELECT _, _, _, _                                                      1
8979787910399768568   SET CLUSTER SETTING "sql.metrics.max_mem_stmt_fingerprints" = DEFAULT  1
17515881800496300282   SET CLUSTER SETTING "sql.metrics.max_mem_txn_fingerprints" = DEFAULT   1

query TTI rowsort
SELECT * FROM txn_fingerprint_view
----
7184384531886178123   {10543509969653713419,5745311157220589902,5153809228704478461}  2
7913717851072930190   {10543509969653713419,5745311157220589902,5323573557126703672}  1
18258640834625550893  {7849245716382231737,18313404398542206079}                         2

statement ok
COMMIT

statement ok
BEGIN; SELECT count(1) AS wombat1; COMMIT

query T
SELECT metadata->>'querySummary' FROM crdb_internal.statement_statistics WHERE metadata->>'query' LIKE '%wombat1%'
----
SELECT count(_) AS wom...

statement ok
SELECT count(1) AS wombat2

query T
SELECT metadata->>'querySummary' FROM crdb_internal.statement_statistics WHERE metadata->>'query' LIKE '%wombat2%'
----
SELECT count(_) AS wom...
