# LogicTest: 3node-tenant

query II
SELECT count(distinct(node_id)), count(*)  FROM crdb_internal.node_runtime_info
----
1 12

query I
SELECT sign(count(*)) FROM crdb_internal.leases
----
1

query error database "crdb_internal" does not exist
ALTER DATABASE crdb_internal RENAME TO not_crdb_internal

statement error schema cannot be modified: "crdb_internal"
CREATE TABLE crdb_internal.t (x INT)

query error database "crdb_internal" does not exist
DROP DATABASE crdb_internal

query TTTTIT rowsort
WITH tables AS (SHOW TABLES FROM crdb_internal) SELECT * FROM tables 
WHERE table_name IN ('node_build_info', 'ranges_no_leases', 'ranges')
----
crdb_internal  node_build_info   table  node  NULL  NULL
crdb_internal  ranges            view   node  NULL  NULL
crdb_internal  ranges_no_leases  table  node  NULL  NULL

statement ok
CREATE DATABASE testdb; CREATE TABLE testdb.foo(x INT)

query TIT
SELECT t.name, t.version, t.state FROM crdb_internal.tables AS t JOIN system.namespace AS n ON (n.id = t.parent_id and n.name = 'testdb');
----
foo 1 PUBLIC

# Ensure there is a lease taken on foo.
query I
SELECT * FROM testdb.foo
----

# Check the lease.
query T
SELECT l.name FROM crdb_internal.leases AS l JOIN system.namespace AS n ON (n.id = l.table_id and n.name = 'foo');
----
foo

# We merely check the column list for schema_changes.
query IITTITTT colnames
SELECT * FROM crdb_internal.schema_changes
----
table_id parent_id name type target_id target_name state direction

# We don't select the modification time as it does not remain contant.
query IITTITTTTTTTI colnames
SELECT
  table_id,
  parent_id,
  name,
  database_name,
  version,
  format_version,
  state,
  sc_lease_node_id,
  sc_lease_expiration_time,
  drop_time,
  audit_mode,
  schema_name,
  parent_schema_id
FROM crdb_internal.tables WHERE NAME = 'descriptor'
----
table_id  parent_id  name        database_name  version  format_version            state   sc_lease_node_id  sc_lease_expiration_time  drop_time  audit_mode  schema_name  parent_schema_id
3         1          descriptor  system         1        InterleavedFormatVersion  PUBLIC  NULL              NULL                      NULL       DISABLED    public       29

# Verify that table names are not double escaped.

statement ok
CREATE TABLE testdb." ""\'" (i int)

query T rowsort
SELECT NAME from crdb_internal.tables WHERE DATABASE_NAME = 'testdb'
----
foo
"\'

query TT colnames
SELECT field, value FROM crdb_internal.node_build_info WHERE field ILIKE 'name'
----
field value
Name  CockroachDB

query T rowsort
SELECT field FROM crdb_internal.node_build_info
----
Name
Build
ClusterID
Organization
Version
Channel
VirtualClusterName

query IITTITTT colnames
SELECT * FROM crdb_internal.schema_changes WHERE table_id < 0
----
table_id  parent_id  name  type  target_id  target_name  state  direction

query IITITB colnames
SELECT * FROM crdb_internal.leases WHERE node_id < 0
----
node_id  table_id  name  parent_id  expiration  deleted


query ITTTTTIIITTRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBTTTTBTTRRRRRI colnames
SELECT * FROM crdb_internal.node_statement_statistics WHERE node_id < 0
----
node_id  application_name  flags  statement_id  key  anonymized  count  first_attempt_count  max_retries  last_error  last_error_code  rows_avg  rows_var  idle_lat_avg  idle_lat_var  parse_lat_avg  parse_lat_var  plan_lat_avg  plan_lat_var  run_lat_avg  run_lat_var  service_lat_avg  service_lat_var  overhead_lat_avg  overhead_lat_var  bytes_read_avg  bytes_read_var  rows_read_avg  rows_read_var  rows_written_avg  rows_written_var  network_bytes_avg  network_bytes_var  network_msgs_avg  network_msgs_var  max_mem_usage_avg  max_mem_usage_var  max_disk_usage_avg  max_disk_usage_var  contention_time_avg  contention_time_var  cpu_sql_nanos_avg  cpu_sql_nanos_var  mvcc_step_avg  mvcc_step_var  mvcc_step_internal_avg  mvcc_step_internal_var  mvcc_seek_avg  mvcc_seek_var  mvcc_seek_internal_avg  mvcc_seek_internal_var  mvcc_block_bytes_avg  mvcc_block_bytes_var  mvcc_block_bytes_in_cache_avg  mvcc_block_bytes_in_cache_var  mvcc_key_bytes_avg  mvcc_key_bytes_var  mvcc_value_bytes_avg  mvcc_value_bytes_var  mvcc_point_count_avg  mvcc_point_count_var  mvcc_points_covered_by_range_tombstones_avg  mvcc_points_covered_by_range_tombstones_var  mvcc_range_key_count_avg  mvcc_range_key_count_var  mvcc_range_key_contained_points_avg  mvcc_range_key_contained_points_var  mvcc_range_key_skipped_points_avg  mvcc_range_key_skipped_points_var  implicit_txn  full_scan  sample_plan  database_name  exec_node_ids  kv_node_ids  used_follower_read  txn_fingerprint_id  index_recommendations  latency_seconds_min  latency_seconds_max  latency_seconds_p50  latency_seconds_p90  latency_seconds_p99  failure_count

query ITTTIIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR colnames
SELECT * FROM crdb_internal.node_transaction_statistics WHERE node_id < 0
----
node_id  application_name  key  statement_ids  count  max_retries  service_lat_avg  service_lat_var  retry_lat_avg  retry_lat_var  commit_lat_avg  commit_lat_var  idle_lat_avg  idle_lat_var  rows_read_avg  rows_read_var  network_bytes_avg  network_bytes_var  network_msgs_avg  network_msgs_var  max_mem_usage_avg  max_mem_usage_var  max_disk_usage_avg  max_disk_usage_var  contention_time_avg  contention_time_var  cpu_sql_nanos_avg  cpu_sql_nanos_var mvcc_step_avg mvcc_step_var mvcc_step_internal_avg mvcc_step_internal_var mvcc_seek_avg mvcc_seek_var mvcc_seek_internal_avg mvcc_seek_internal_var mvcc_block_bytes_avg mvcc_block_bytes_var mvcc_block_bytes_in_cache_avg mvcc_block_bytes_in_cache_var mvcc_key_bytes_avg mvcc_key_bytes_var mvcc_value_bytes_avg mvcc_value_bytes_var mvcc_point_count_avg mvcc_point_count_var mvcc_points_covered_by_range_tombstones_avg mvcc_points_covered_by_range_tombstones_var mvcc_range_key_count_avg mvcc_range_key_count_var mvcc_range_key_contained_points_avg mvcc_range_key_contained_points_var mvcc_range_key_skipped_points_avg mvcc_range_key_skipped_points_var

query IITTTTTTT colnames
SELECT * FROM crdb_internal.session_trace WHERE span_idx < 0
----
span_idx  message_idx  timestamp  duration  operation  loc  tag  message age

query TTTBTTTT colnames
SELECT * FROM crdb_internal.cluster_settings WHERE variable = ''
----
variable  value  type  public  description default_value origin key

query TI colnames
SELECT * FROM crdb_internal.feature_usage WHERE feature_name = ''
----
feature_name  usage_count

query TTB colnames
SELECT * FROM crdb_internal.session_variables WHERE variable = ''
----
variable  value  hidden

query TTITTTTTTBTBTT colnames
SELECT * FROM crdb_internal.node_queries WHERE node_id < 0
----
query_id  txn_id  node_id  session_id  user_name  start  query  client_address  application_name  distributed  phase  full_scan  plan_gist  database

query TTITTTTTTBTBTT colnames
SELECT * FROM crdb_internal.cluster_queries WHERE node_id < 0
----
query_id  txn_id  node_id  session_id  user_name  start  query  client_address  application_name  distributed  phase  full_scan  plan_gist  database

query TITTTTIIITTTT colnames
SELECT  * FROM crdb_internal.node_transactions WHERE node_id < 0
----
id  node_id  session_id  start  txn_string  application_name  num_stmts  num_retries  num_auto_retries  last_auto_retry_reason  isolation_level  priority  quality_of_service

query TITTTTIIITTTT colnames
SELECT  * FROM crdb_internal.cluster_transactions WHERE node_id < 0
----
id  node_id  session_id  start  txn_string  application_name  num_stmts  num_retries  num_auto_retries  last_auto_retry_reason  isolation_level  priority  quality_of_service

query ITTTTTTTITTTIITTIII colnames
SELECT * FROM crdb_internal.node_sessions WHERE node_id < 0
----
node_id  session_id  user_name  client_address  application_name  active_queries  last_active_query  num_txns_executed  session_start  active_query_start  kv_txn  alloc_bytes  max_alloc_bytes  status  session_end  pg_backend_pid  trace_id  goroutine_id  authentication_method

query ITTTTTTTITTTIITTIII colnames
SELECT * FROM crdb_internal.cluster_sessions WHERE node_id < 0
----
node_id  session_id  user_name  client_address  application_name  active_queries  last_active_query  num_txns_executed  session_start  active_query_start  kv_txn  alloc_bytes  max_alloc_bytes  status  session_end  pg_backend_pid  trace_id  goroutine_id  authentication_method

query IIITTTI colnames
SELECT * FROM crdb_internal.node_contention_events WHERE table_id < 0
----
table_id  index_id  num_contention_events  cumulative_contention_time  key  txn_id  count

query IIITTTI colnames
SELECT * FROM crdb_internal.cluster_contention_events WHERE table_id < 0
----
table_id  index_id  num_contention_events  cumulative_contention_time  key  txn_id  count

query TTTTTO colnames
SELECT * FROM crdb_internal.builtin_functions WHERE function = ''
----
function  signature  category  details  schema  oid

query ITTITTTTTTTTBBBB colnames
SELECT * FROM crdb_internal.create_statements WHERE database_name = ''
----
database_id  database_name  schema_name  descriptor_id  descriptor_type  descriptor_name  create_statement  state  create_nofks  alter_statements  validate_statements  create_redactable  has_partitions  is_multi_region  is_virtual  is_temporary

query ITITTBTB colnames
SELECT * FROM crdb_internal.table_columns WHERE descriptor_name = ''
----
descriptor_id  descriptor_name  column_id  column_name  column_type  nullable  default_expr  hidden

query ITITTBBBBFITT colnames
SELECT * FROM crdb_internal.table_indexes WHERE descriptor_name = ''
----
descriptor_id  descriptor_name  index_id  index_name  index_type  is_unique  is_inverted  is_sharded  is_visible  visibility  shard_bucket_count  created_at  create_statement

query ITITTITTB colnames
SELECT * FROM crdb_internal.index_columns WHERE descriptor_name = ''
----
descriptor_id  descriptor_name  index_id  index_name  column_type  column_id  column_name  column_direction  implicit

query ITIIITITT colnames
SELECT * FROM crdb_internal.backward_dependencies WHERE descriptor_name = ''
----
descriptor_id  descriptor_name  index_id  column_id  dependson_id  dependson_type  dependson_index_id  dependson_name  dependson_details

query ITIITITT colnames
SELECT * FROM crdb_internal.forward_dependencies WHERE descriptor_name = ''
----
descriptor_id  descriptor_name  index_id  dependedonby_id  dependedonby_type  dependedonby_index_id  dependedonby_name  dependedonby_details

query IITTTTTTTTTTTT colnames
SELECT * FROM crdb_internal.zones WHERE false
----
zone_id  subzone_id  target  range_name  database_name  schema_name  table_name  index_name  partition_name
raw_config_yaml  raw_config_sql  raw_config_protobuf full_config_yaml full_config_sql

query IIIIBTIT colnames
SELECT * FROM crdb_internal.node_inflight_trace_spans WHERE span_id < 0
----
trace_id  parent_span_id  span_id  goroutine_id  finished  start_time  duration  operation

query TTTBTTTTTIITITTTTTTTTTTTTTITT colnames
SELECT * FROM crdb_internal.cluster_execution_insights WHERE query = ''
----
session_id  txn_id  txn_fingerprint_id  stmt_id  stmt_fingerprint_id  problem  causes  query  status  start_time  end_time  full_scan  user_name  app_name  database_name  plan_gist  rows_read  rows_written  priority  retries  last_retry_reason  exec_node_ids  kv_node_ids  contention  index_recommendations  implicit_txn  cpu_sql_nanos  error_code  last_error_redactable

query TTTBTTTTTIITITTTTTTTTTTTTTITT colnames
SELECT * FROM crdb_internal.node_execution_insights WHERE query = ''
----
session_id  txn_id  txn_fingerprint_id  stmt_id  stmt_fingerprint_id  problem  causes  query  status  start_time  end_time  full_scan  user_name  app_name  database_name  plan_gist  rows_read  rows_written  priority  retries  last_retry_reason  exec_node_ids  kv_node_ids  contention  index_recommendations  implicit_txn  cpu_sql_nanos  error_code  last_error_redactable

query TTTBTTTTTIITITTTTTITTT colnames
SELECT * FROM crdb_internal.cluster_txn_execution_insights WHERE query = ''
----
txn_id  txn_fingerprint_id  query  implicit_txn  session_id  start_time  end_time  user_name  app_name  rows_read  rows_written  priority  retries  last_retry_reason  contention  problems  causes  stmt_execution_ids  cpu_sql_nanos  last_error_code  last_error_redactable status

query TTTBTTTTTIITITTTTTITTT colnames
SELECT * FROM crdb_internal.node_txn_execution_insights WHERE query = ''
----
txn_id  txn_fingerprint_id  query  implicit_txn  session_id  start_time  end_time  user_name  app_name  rows_read  rows_written  priority  retries  last_retry_reason  contention  problems  causes  stmt_execution_ids  cpu_sql_nanos  last_error_code  last_error_redactable status

query ITTI
SELECT range_id, start_pretty, end_pretty, lease_holder FROM crdb_internal.ranges
----
75  /Tenant/10  /Tenant/11  1

query ITT
SELECT range_id, start_pretty, end_pretty FROM crdb_internal.ranges_no_leases
----
75  /Tenant/10  /Tenant/11

query IT
SELECT zone_id, target FROM crdb_internal.zones ORDER BY 1
----
0  RANGE default

query error pq: foo
SELECT crdb_internal.force_error('', 'foo')

query error pgcode FOOYAA pq: foo
SELECT crdb_internal.force_error('FOOYAA', 'foo')

query I
select crdb_internal.force_retry(interval '0s')
----
0

query error pq: crdb_internal.set_vmodule\(\): syntax error: expect comma-separated list of filename=N
select crdb_internal.set_vmodule('not anything reasonable')

query I
select crdb_internal.set_vmodule('doesntexist=2,butitsok=4')
----
0

query T
select crdb_internal.get_vmodule()
----
doesntexist=2,butitsok=4

query I
select crdb_internal.set_vmodule('')
----
0

query T
select crdb_internal.get_vmodule()
----
·

query T
SELECT crdb_internal.release_series(crdb_internal.node_executable_version())
----
25.1

query ITTT colnames,rowsort
select node_id, component, field, regexp_replace(regexp_replace(value, '^\d+$', '<port>'), e':\\d+', ':<port>') as value from crdb_internal.node_runtime_info
----
node_id  component  field   value
0        DB         URL     postgresql://root@127.0.0.1:<port>/defaultdb?sslcert=test_certs%2Fclient.root.crt&sslkey=test_certs%2Fclient.root.key&sslmode=verify-full&sslrootcert=test_certs%2Fca.crt
0        DB         Scheme  postgresql
0        DB         User    root
0        DB         Host    127.0.0.1
0        DB         Port    <port>
0        DB         URI     /defaultdb?sslcert=test_certs%2Fclient.root.crt&sslkey=test_certs%2Fclient.root.key&sslmode=verify-full&sslrootcert=test_certs%2Fca.crt
0        UI         URL     https://127.0.0.1:<port>
0        UI         Scheme  https
0        UI         User    ·
0        UI         Host    127.0.0.1
0        UI         Port    <port>
0        UI         URI     /

statement error unsupported within a virtual cluster
SELECT node_id FROM crdb_internal.gossip_nodes WHERE node_id = 1

statement error unsupported within a virtual cluster
SELECT node_id FROM crdb_internal.gossip_liveness WHERE node_id = 1

statement error unsupported within a virtual cluster
SELECT node_id FROM crdb_internal.kv_node_status WHERE node_id = 1

statement error unsupported within a virtual cluster
SELECT node_id FROM crdb_internal.kv_store_status WHERE node_id = 1

query TT
SELECT * FROM crdb_internal.regions ORDER BY 1
----
test  {}

statement ok
CREATE TABLE foo (a INT PRIMARY KEY, INDEX idx(a)); INSERT INTO foo VALUES(1)

# Make sure that the cluster id isn't unset.
query B
select crdb_internal.cluster_id() != '00000000-0000-0000-0000-000000000000' FROM foo
----
true

# Check that privileged builtins are only allowed for 'root'
user testuser

query error user testuser does not have REPAIRCLUSTER system privilege
select crdb_internal.force_panic('foo')

query error user testuser does not have REPAIRCLUSTER system privilege
select crdb_internal.force_log_fatal('foo')

query error user testuser does not have REPAIRCLUSTER system privilege
select crdb_internal.set_vmodule('')

query error user testuser does not have REPAIRCLUSTER system privilege
select crdb_internal.get_vmodule()

query error user testuser does not have VIEWCLUSTERMETADATA system privilege
select * from crdb_internal.node_runtime_info

query error pq: only users with the VIEWACTIVITY or VIEWACTIVITYREDACTED or ZONECONFIG privilege or the admin role can read crdb_internal.ranges_no_leases
select * from crdb_internal.ranges

query error user testuser does not have VIEWCLUSTERMETADATA system privilege
select * from crdb_internal.gossip_nodes

query error user testuser does not have VIEWCLUSTERMETADATA system privilege
select * from crdb_internal.gossip_liveness

query error user testuser does not have VIEWCLUSTERMETADATA system privilege
select * from crdb_internal.node_metrics

query error user testuser does not have VIEWCLUSTERMETADATA system privilege
select * from crdb_internal.kv_node_status

query error user testuser does not have VIEWCLUSTERMETADATA system privilege
select * from crdb_internal.kv_store_status

query error user testuser does not have VIEWCLUSTERMETADATA system privilege
select * from crdb_internal.gossip_alerts

# Anyone can see the executable version.
query T
SELECT crdb_internal.release_series(crdb_internal.node_executable_version())
----
25.1

user root

# Regression test for #34441
query T
SELECT crdb_internal.pretty_key(e'\\xa82a00918ed9':::BYTES, (-5096189069466142898):::INT8);
----
/Table/32/???/9/6/81

subtest max_retry_counter
# Verify that the max_retry counter in statement stats actually increases with retries.

statement ok
SET application_name = 'test_max_retry'

# Make the statement retry, to ensure max_retries increases to
# become different from 0.
statement OK
CREATE SEQUENCE s;

statement OK
SELECT IF(nextval('s')<3, crdb_internal.force_retry('1h'::INTERVAL), 0);

statement OK
DROP SEQUENCE s

statement OK
RESET application_name

# Note: in the following test, three rows of output are expected:
# - one for the SELECT statements that failed with a retry error,
# - one for the final SELECT retry attempt that succeeded without an error,
# - one for the RESET statement.
#
# We expect the first two entries to have max_retries > 0 because
# auto-retries are expected by the server.
# We also expect the RESET statement to have max_retries = 0, because
# RESET never retries. This tests that the retry counter is properly
# reset to 0 between statements - a naive implementation could make
# the counter increase forever, even between statements.
#
# TODO(radu): there should be a single fingerprint, with ::INTERVAL. The
# different fingerprint on retries is caused by in-place mutation of the AST
# (#22847).
#

query TII
SELECT key, max_retries, failure_count
  FROM crdb_internal.node_statement_statistics
 WHERE application_name = 'test_max_retry'
ORDER BY key
----
CREATE SEQUENCE s                                                     0  0
DROP SEQUENCE s                                                       0  0
RESET application_name                                                0  0
SELECT IF(nextval(_) < _, crdb_internal.force_retry(_), _)            2  1
SELECT IF(nextval(_) < _, crdb_internal.force_retry(_::INTERVAL), _)  0  1

query T
SELECT crdb_internal.cluster_name()
----
testclustername

# Regression for 41834.
statement ok
CREATE TABLE table41834 ();

statement ok
SELECT
	crdb_internal.encode_key(
		-8912529861854991652,
		0,
		CASE
		WHEN false THEN (NULL,)
		ELSE (NULL,)
		END
	)
FROM
	table41834;

user root

# Test the crdb_internal.create_type_statements table.
statement ok
CREATE TYPE enum1 AS ENUM ('hello', 'hi');
CREATE TYPE enum2 AS ENUM ()

query ITTITTT
SELECT * FROM crdb_internal.create_type_statements ORDER BY descriptor_id
----
104  test  public  113  enum1  CREATE TYPE test.public.enum1 AS ENUM ('hello', 'hi')  {hello,hi}
104  test  public  115  enum2  CREATE TYPE test.public.enum2 AS ENUM ()               {}

# Test the virtual index as well.

statement ok
SET application_name = "test_txn_statistics"

statement ok
CREATE TABLE t_53504()

statement ok
BEGIN; SELECT * FROM t_53504; SELECT * FROM t_53504; SELECT * FROM t_53504; COMMIT;

statement ok
BEGIN; SELECT * FROM t_53504; SELECT * FROM t_53504; COMMIT;

statement ok
BEGIN; SELECT * FROM t_53504; SELECT * FROM t_53504; COMMIT;

statement ok
BEGIN; SELECT * FROM t_53504; COMMIT;

statement ok
SELECT * FROM t_53504

query ITTTI colnames,rowsort
SELECT node_id, application_name, key, statement_ids, count FROM crdb_internal.node_transaction_statistics where application_name = 'test_txn_statistics'
----
node_id  application_name     key                   statement_ids                                                  count
0        test_txn_statistics  9852458619443781049   {6504861979500726990,6504861979500726990,6504861979500726990} 1
0        test_txn_statistics  17664899828239596817  {6504861979500726990}                                          1
0        test_txn_statistics  17664899828239596829  {6504861979500726978}                                          1
0        test_txn_statistics  17976145939037309168  {6204733445766643503}                                          1
0        test_txn_statistics  18364202634803759405  {6504861979500726990,6504861979500726990}                      2

subtest node_tenant_capabilities_cache

user testuser

statement error user testuser does not have VIEWCLUSTERMETADATA system privilege
SELECT * FROM crdb_internal.node_tenant_capabilities_cache

user root

statement error operation node_tenant_capabilities_cache supported only by system tenant
SELECT * FROM crdb_internal.node_tenant_capabilities_cache

subtest end
