exec-sql
SET application_name = 'test'
----

exec-sql
SELECT 1
SELECT 1
SELECT 1, 1
----


exec-sql
BEGIN
SELECT 1
SELECT 1, 1
SELECT 1, 1
COMMIT
----


exec-sql
BEGIN
SELECT 1
SELECT 1, 1
SELECT 1, 1
SELECT 1, 1
COMMIT
----

exec-sql
BEGIN
SELECT 1
SELECT 1, 1
SELECT 1, 1
SELECT 1, 1
COMMIT
----

# Ensure we records both explicit transactions with correct statement
# fingerprint IDs. We filter out transactions that has less than 3 statements
# in order to ignore the implicit transactions.
observe-sql
SELECT
  encode(fingerprint_id, 'hex'),
  metadata -> 'stmtFingerprintIDs'
FROM
  crdb_internal.transaction_statistics
WHERE
  app_name = 'test' AND
  jsonb_array_length(metadata -> 'stmtFingerprintIDs') >= 3
ORDER BY
  jsonb_array_length(metadata -> 'stmtFingerprintIDs')
ASC
----
dce4fa24f23a3c31,["1d2a16425a50b888", "647cd604b055a7b7", "647cd604b055a7b7"]
f72debc328a1e0f4,["1d2a16425a50b888", "647cd604b055a7b7", "647cd604b055a7b7", "647cd604b055a7b7"]

# Ensures the statistics for each explicit transactions are grouped into
# different entry.
observe-sql
SELECT
  encode(s.fingerprint_id, 'hex') AS stmtFingerprintID,
  encode(t.fingerprint_id, 'hex') AS txnFingerprintID,
  s.metadata ->> 'query' AS query,
  (s.statistics -> 'statistics' ->> 'cnt')::INT AS count
FROM
  crdb_internal.statement_statistics s,
  crdb_internal.transaction_statistics t
WHERE
  s.app_name = 'test' AND
  encode(s.transaction_fingerprint_id, 'hex') = encode(t.fingerprint_id, 'hex') AND
  jsonb_array_length(t.metadata -> 'stmtFingerprintIDs') >= 3
ORDER BY
  2, 4
----
1d2a16425a50b888,dce4fa24f23a3c31,SELECT _,1
647cd604b055a7b7,dce4fa24f23a3c31,SELECT _, _,2
1d2a16425a50b888,f72debc328a1e0f4,SELECT _,2
647cd604b055a7b7,f72debc328a1e0f4,SELECT _, _,6

# Ensures that implicit transaction stats are collected separately.
observe-sql
SELECT
  encode(fingerprint_id, 'hex') AS stmtFingerprintID,
  encode(transaction_fingerprint_id, 'hex') AS txnFingerprintID,
  metadata ->> 'query',
  (statistics -> 'statistics' ->> 'cnt')::INT
FROM
  crdb_internal.statement_statistics
WHERE
  app_name = 'test' AND
  metadata ->> 'query' IN (
    'SELECT _', 'SELECT _, _'
  ) AND
  encode(transaction_fingerprint_id, 'hex') NOT IN (
    SELECT
      encode(fingerprint_id, 'hex')
    FROM
      crdb_internal.transaction_statistics
    WHERE
      jsonb_array_length(metadata -> 'stmtFingerprintIDs') >= 3
  )
ORDER BY
  2
----
1d2a16425a50b884,b249ab0edc510f5b,SELECT _,2
647cd604b055a7bb,cb1f6b4836541064,SELECT _, _,1


sql-stats-flush
----

# Run the same tests again after the flush.

# Ensure we records both explicit transactions with correct statement
# fingerprint IDs.
observe-sql
SELECT
  encode(fingerprint_id, 'hex'),
  metadata -> 'stmtFingerprintIDs'
FROM
  crdb_internal.transaction_statistics
WHERE
  app_name = 'test' AND
  jsonb_array_length(metadata -> 'stmtFingerprintIDs') >= 3
ORDER BY
  jsonb_array_length(metadata -> 'stmtFingerprintIDs')
ASC
----
dce4fa24f23a3c31,["1d2a16425a50b888", "647cd604b055a7b7", "647cd604b055a7b7"]
f72debc328a1e0f4,["1d2a16425a50b888", "647cd604b055a7b7", "647cd604b055a7b7", "647cd604b055a7b7"]

# Ensures the statistics for each explicit transactions are grouped into
# different entry.
observe-sql
SELECT
  encode(s.fingerprint_id, 'hex') AS stmtFingerprintID,
  encode(t.fingerprint_id, 'hex') AS txnFingerprintID,
  s.metadata ->> 'query' AS query,
  (s.statistics -> 'statistics' ->> 'cnt')::INT AS count
FROM
  crdb_internal.statement_statistics s,
  crdb_internal.transaction_statistics t
WHERE
  s.app_name = 'test' AND
  encode(s.transaction_fingerprint_id, 'hex') = encode(t.fingerprint_id, 'hex') AND
  jsonb_array_length(t.metadata -> 'stmtFingerprintIDs') >= 3
ORDER BY
  2, 4
----
1d2a16425a50b888,dce4fa24f23a3c31,SELECT _,1
647cd604b055a7b7,dce4fa24f23a3c31,SELECT _, _,2
1d2a16425a50b888,f72debc328a1e0f4,SELECT _,2
647cd604b055a7b7,f72debc328a1e0f4,SELECT _, _,6

# Ensures that implicit transaction stats are collected separately.
observe-sql
SELECT
  encode(fingerprint_id, 'hex') AS stmtFingerprintID,
  encode(transaction_fingerprint_id, 'hex') AS txnFingerprintID,
  metadata ->> 'query',
  (statistics -> 'statistics' ->> 'cnt')::INT
FROM
  crdb_internal.statement_statistics
WHERE
  app_name = 'test' AND
  metadata ->> 'query' IN (
    'SELECT _', 'SELECT _, _'
  ) AND
  encode(transaction_fingerprint_id, 'hex') NOT IN (
    SELECT
      encode(fingerprint_id, 'hex')
    FROM
      crdb_internal.transaction_statistics
    WHERE
      jsonb_array_length(metadata -> 'stmtFingerprintIDs') >= 3
  )
ORDER BY
  (statistics -> 'statistics' ->> 'cnt')::INT
ASC
----
647cd604b055a7bb,cb1f6b4836541064,SELECT _, _,1
1d2a16425a50b884,b249ab0edc510f5b,SELECT _,2
