Skip to content

Commit 9f7bab1

Browse files
craig[bot]rafiss
craig[bot]
andcommitted
Merge #141195
141195: sql: crdb_internal.zones no longer fails with offline database r=rafiss a=rafiss fixes #139848 informs https://github.com/cockroachlabs/support/issues/3157 Release note (bug fix): Fixed a bug that could prevent SHOW CREATE TABLE from working if a database was offline (e.g., due to a RESTORE on that database). Co-authored-by: Rafi Shamim <[email protected]>
2 parents a4c43db + f147b6d commit 9f7bab1

File tree

2 files changed

+80
-36
lines changed

2 files changed

+80
-36
lines changed

pkg/sql/crdb_internal.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -5008,7 +5008,7 @@ CREATE TABLE crdb_internal.zones (
50085008

50095009
var table catalog.TableDescriptor
50105010
if zs.Database != "" {
5011-
database, err := p.Descriptors().ByIDWithoutLeased(p.txn).WithoutNonPublic().Get().Database(ctx, descpb.ID(id))
5011+
database, err := p.Descriptors().ByIDWithoutLeased(p.txn).Get().Database(ctx, descpb.ID(id))
50125012
if err != nil {
50135013
return err
50145014
}
@@ -5018,7 +5018,7 @@ CREATE TABLE crdb_internal.zones (
50185018
continue
50195019
}
50205020
} else if zoneSpecifier.TableOrIndex.Table.ObjectName != "" {
5021-
tableEntry, err := p.Descriptors().ByIDWithoutLeased(p.txn).WithoutDropped().Get().Table(ctx, descpb.ID(id))
5021+
tableEntry, err := p.Descriptors().ByIDWithoutLeased(p.txn).Get().Table(ctx, descpb.ID(id))
50225022
if err != nil {
50235023
return err
50245024
}

pkg/sql/logictest/testdata/logic_test/crdb_internal

+78-34
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,50 @@ ALTER RANGE default CONFIGURE ZONE USING
506506
constraints = '[]',
507507
lease_preferences = '[]'
508508

509+
subtest zones_offline_db
510+
511+
statement ok
512+
CREATE TABLE empty ()
513+
514+
statement ok
515+
CREATE DATABASE a
516+
517+
statement ok
518+
ALTER DATABASE a CONFIGURE ZONE USING gc.ttlseconds = 1000
519+
520+
let $a_id
521+
SELECT id FROM system.namespace WHERE name = 'a' AND "parentID" = 0
522+
523+
statement ok
524+
WITH to_update AS (
525+
SELECT id, crdb_internal.pb_to_json('cockroach.sql.sqlbase.Descriptor', descriptor.descriptor) as descriptor
526+
FROM system.descriptor
527+
WHERE id = $a_id
528+
), updated AS (
529+
SELECT id, json_set(descriptor, ARRAY['database', 'state'], '"OFFLINE"'::JSONB) as descriptor FROM to_update
530+
), encoded AS (
531+
SELECT id, crdb_internal.json_to_pb('cockroach.sql.sqlbase.Descriptor', descriptor) as descriptor FROM updated
532+
)
533+
SELECT crdb_internal.unsafe_upsert_descriptor(id, descriptor, true) FROM encoded
534+
535+
# Regression test for #139848. This query used to fail while querying
536+
# crdb_internal.zones because of the offline database.
537+
query TT
538+
SHOW CREATE empty
539+
----
540+
empty CREATE TABLE public.empty (
541+
rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
542+
CONSTRAINT empty_pkey PRIMARY KEY (rowid ASC)
543+
)
544+
545+
query T
546+
SELECT raw_config_sql FROM crdb_internal.zones WHERE zone_id = $a_id
547+
----
548+
ALTER DATABASE a CONFIGURE ZONE USING
549+
gc.ttlseconds = 1000
550+
551+
subtest end
552+
509553
query error pq: foo
510554
SELECT crdb_internal.force_error('', 'foo')
511555

@@ -604,7 +648,7 @@ query TTT colnames
604648
SELECT start_pretty, end_pretty, split_enforced_until FROM crdb_internal.ranges WHERE split_enforced_until IS NOT NULL
605649
----
606650
start_pretty end_pretty split_enforced_until
607-
/Table/112/1/2 /Max 2262-04-11 23:47:16.854776 +0000 +0000
651+
/Table/115/1/2 /Max 2262-04-11 23:47:16.854776 +0000 +0000
608652

609653
query TTT colnames
610654
SELECT start_key, end_key, split_enforced_until FROM [SHOW RANGES FROM TABLE foo] WHERE split_enforced_until IS NOT NULL
@@ -782,12 +826,12 @@ query TT colnames,rowsort
782826
SELECT start_pretty, end_pretty FROM crdb_internal.ranges WHERE split_enforced_until IS NOT NULL
783827
----
784828
start_pretty end_pretty
785-
/Table/112/1/1 /Table/112/1/2
786-
/Table/112/1/2 /Table/112/1/3
787-
/Table/112/1/3 /Table/112/2/1
788-
/Table/112/2/1 /Table/112/2/2
789-
/Table/112/2/2 /Table/112/2/3
790-
/Table/112/2/3 /Max
829+
/Table/115/1/1 /Table/115/1/2
830+
/Table/115/1/2 /Table/115/1/3
831+
/Table/115/1/3 /Table/115/2/1
832+
/Table/115/2/1 /Table/115/2/2
833+
/Table/115/2/2 /Table/115/2/3
834+
/Table/115/2/3 /Max
791835

792836
# The cleanup we expect in the following truncate requires that the GCJob runs.
793837
# To avoid this taking 30 seconds, we lower the job adoption interval.
@@ -816,12 +860,12 @@ query TT colnames,retry,rowsort
816860
SELECT start_pretty, end_pretty FROM crdb_internal.ranges WHERE split_enforced_until IS NOT NULL
817861
----
818862
start_pretty end_pretty
819-
/Table/112/3/1 /Table/112/3/2
820-
/Table/112/3/2 /Table/112/3/3
821-
/Table/112/3/3 /Table/112/4/1
822-
/Table/112/4/1 /Table/112/4/2
823-
/Table/112/4/2 /Table/112/4/3
824-
/Table/112/4/3 /Max
863+
/Table/115/3/1 /Table/115/3/2
864+
/Table/115/3/2 /Table/115/3/3
865+
/Table/115/3/3 /Table/115/4/1
866+
/Table/115/4/1 /Table/115/4/2
867+
/Table/115/4/2 /Table/115/4/3
868+
/Table/115/4/3 /Max
825869

826870
statement ok
827871
DROP TABLE foo
@@ -844,12 +888,12 @@ query TT colnames,retry,rowsort
844888
SELECT start_pretty, end_pretty FROM crdb_internal.ranges WHERE split_enforced_until IS NOT NULL
845889
----
846890
start_pretty end_pretty
847-
/Table/114/1/1 /Table/114/1/2
848-
/Table/114/1/2 /Table/114/1/3
849-
/Table/114/1/3 /Table/114/2/1
850-
/Table/114/2/1 /Table/114/2/2
851-
/Table/114/2/2 /Table/114/2/3
852-
/Table/114/2/3 /Max
891+
/Table/117/1/1 /Table/117/1/2
892+
/Table/117/1/2 /Table/117/1/3
893+
/Table/117/1/3 /Table/117/2/1
894+
/Table/117/2/1 /Table/117/2/2
895+
/Table/117/2/2 /Table/117/2/3
896+
/Table/117/2/3 /Max
853897

854898
statement ok
855899
DROP INDEX foo@idx
@@ -860,9 +904,9 @@ query T colnames,retry,rowsort
860904
SELECT start_pretty FROM crdb_internal.ranges WHERE split_enforced_until IS NOT NULL
861905
----
862906
start_pretty
863-
/Table/114/1/1
864-
/Table/114/1/2
865-
/Table/114/1/3
907+
/Table/117/1/1
908+
/Table/117/1/2
909+
/Table/117/1/3
866910

867911
query T
868912
SELECT crdb_internal.cluster_name()
@@ -926,15 +970,15 @@ CREATE TYPE enum2 AS ENUM ()
926970
query ITTITTT
927971
SELECT * FROM crdb_internal.create_type_statements ORDER BY descriptor_id
928972
----
929-
104 test public 116 enum1 CREATE TYPE public.enum1 AS ENUM ('hello', 'hi') {hello,hi}
930-
104 test public 118 enum2 CREATE TYPE public.enum2 AS ENUM () {}
973+
104 test public 119 enum1 CREATE TYPE public.enum1 AS ENUM ('hello', 'hi') {hello,hi}
974+
104 test public 121 enum2 CREATE TYPE public.enum2 AS ENUM () {}
931975

932976
# Test the virtual index as well.
933977

934978
query ITTITTT
935979
SELECT * FROM crdb_internal.create_type_statements WHERE descriptor_id = (('enum1'::regtype::oid::int) - 100000)::oid
936980
----
937-
104 test public 116 enum1 CREATE TYPE public.enum1 AS ENUM ('hello', 'hi') {hello,hi}
981+
104 test public 119 enum1 CREATE TYPE public.enum1 AS ENUM ('hello', 'hi') {hello,hi}
938982

939983
query ITTITTT
940984
SELECT * FROM crdb_internal.create_type_statements WHERE descriptor_id = 'foo'::regclass::oid
@@ -1512,19 +1556,19 @@ FROM crdb_internal.create_procedure_statements
15121556
WHERE procedure_name IN ('p', 'p2')
15131557
ORDER BY procedure_id;
15141558
----
1515-
104 test 105 public 139 p CREATE PROCEDURE public.p(INT8)
1559+
104 test 105 public 142 p CREATE PROCEDURE public.p(INT8)
15161560
LANGUAGE SQL
15171561
SECURITY INVOKER
15181562
AS $$
15191563
SELECT 1;
15201564
$$
1521-
104 test 105 public 140 p CREATE PROCEDURE public.p(STRING, b INT8)
1565+
104 test 105 public 143 p CREATE PROCEDURE public.p(STRING, b INT8)
15221566
LANGUAGE SQL
15231567
SECURITY INVOKER
15241568
AS $$
15251569
SELECT 'hello';
15261570
$$
1527-
104 test 142 sc 143 p2 CREATE PROCEDURE sc.p2(STRING)
1571+
104 test 145 sc 146 p2 CREATE PROCEDURE sc.p2(STRING)
15281572
LANGUAGE SQL
15291573
SECURITY INVOKER
15301574
AS $$
@@ -1543,25 +1587,25 @@ FROM "".crdb_internal.create_procedure_statements
15431587
WHERE procedure_name IN ('p', 'p2', 'p_cross_db')
15441588
ORDER BY procedure_id;
15451589
----
1546-
104 test 105 public 139 p CREATE PROCEDURE public.p(INT8)
1590+
104 test 105 public 142 p CREATE PROCEDURE public.p(INT8)
15471591
LANGUAGE SQL
15481592
SECURITY INVOKER
15491593
AS $$
15501594
SELECT 1;
15511595
$$
1552-
104 test 105 public 140 p CREATE PROCEDURE public.p(STRING, b INT8)
1596+
104 test 105 public 143 p CREATE PROCEDURE public.p(STRING, b INT8)
15531597
LANGUAGE SQL
15541598
SECURITY INVOKER
15551599
AS $$
15561600
SELECT 'hello';
15571601
$$
1558-
104 test 142 sc 143 p2 CREATE PROCEDURE sc.p2(STRING)
1602+
104 test 145 sc 146 p2 CREATE PROCEDURE sc.p2(STRING)
15591603
LANGUAGE SQL
15601604
SECURITY INVOKER
15611605
AS $$
15621606
SELECT 'hello';
15631607
$$
1564-
144 test_cross_db 145 public 146 p_cross_db CREATE PROCEDURE public.p_cross_db()
1608+
147 test_cross_db 148 public 149 p_cross_db CREATE PROCEDURE public.p_cross_db()
15651609
LANGUAGE SQL
15661610
SECURITY INVOKER
15671611
AS $$
@@ -1686,13 +1730,13 @@ CREATE TYPE other_db.public.enum1 AS ENUM ('yo');
16861730
query ITTITTT
16871731
SELECT * FROM "".crdb_internal.create_type_statements WHERE descriptor_name = 'enum1' and database_name = 'other_db'
16881732
----
1689-
121 other_db public 151 enum1 CREATE TYPE public.enum1 AS ENUM ('yo') {yo}
1733+
124 other_db public 154 enum1 CREATE TYPE public.enum1 AS ENUM ('yo') {yo}
16901734

16911735
# This uses the virtual index. descriptor_id is an int in the vtable.
16921736
query ITTITTT
16931737
SELECT * FROM "".crdb_internal.create_type_statements WHERE descriptor_id = (('other_db.public.enum1'::regtype::int) - 100000)
16941738
----
1695-
121 other_db public 151 enum1 CREATE TYPE public.enum1 AS ENUM ('yo') {yo}
1739+
124 other_db public 154 enum1 CREATE TYPE public.enum1 AS ENUM ('yo') {yo}
16961740

16971741
# Repeat above two queries but apply only for the current database. We do this by omitting the "".
16981742
# This one uses the full table scan.

0 commit comments

Comments
 (0)