-
Notifications
You must be signed in to change notification settings - Fork 3.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
sql: deprecate cross-database references between catalog elements #55791
Comments
The current thinking is that we'll start the migration for #55793 automatically after the user has set some flag (via cluster setting) and implement all this as one long-running migration. |
One important consideration for this task is the interaction with cc @mwang1026 |
Thanks for the ping. Let me bring this to the team to discuss. My initial thought is to invalidate them with some sort of warning after the fact, but want to talk through other options too (e.g. invalidation is an option, otherwise error if we find them). |
@ajwerner should we add a cluster upgrade precondition for 23.1 which checks that the cross-database cluster setting is disabled, to consider this done? |
Steps:
|
Casting an OID to REGNAMESPACE runs this SQL using the internal executor: ``` SELECT pg_namespace.oid, nspname FROM pg_catalog.pg_namespace WHERE oid = $1 ``` When the `GenerateConstrainedScans` rule is disabled, this returns no rows and so doesn't apply the cast. The same SQL, not run via an internal executor, but also with `GenerateConstrainedScans` disabled, behaves correctly. Disabling `GenerateConstrainedScans` all the time prevents the cluster from starting. The reason a full scan of pg_namespace doesn't find the OID is because it only checks for schemas in the current database: https://github.com/cockroachdb/cockroach/blob/7b341ffa678e4a22416e2274351fd56f415f5421/pkg/sql/virtual_schema.go#L602 https://github.com/cockroachdb/cockroach/blob/d10c3dd42c3dc40cad82792a30ae47fd2a663f43/pkg/sql/pg_catalog.go#L2099-L2106 https://github.com/cockroachdb/cockroach/blob/a7e9c4a68b81436d1f9382518d4267f74cbdac94/pkg/sql/information_schema.go#L2295-L2296 Whereas with a constrained scan, all descriptors are searched: https://github.com/cockroachdb/cockroach/blob/af6a72a622ae05f3733b5db637403b3eaa9455f1/pkg/sql/catalog/descs/descriptor.go#L168-L175 The correct result is from the constrained scan, because we currently allow cross-database references. Once cockroachdb#55791 is fixed, both results should match. The fix alternatives are: 1. disallow disabling of the `GenerateConstrainedScans` rule for internal SQL 2. turn off generation of REGNAMESPACE expressions in randgen to avoid hitting this problem in tests. The 2nd fix alternative is implemented to avoid losing any of the rule-disabling test coverage provided by the `testing_optimizer_disable_rule_probability` setting. Fixes cockroachdb#98322 Release note: None
99168: randgen: disable generation of REGNAMESPACE type expressions r=msirek a=msirek Casting an OID to REGNAMESPACE runs this SQL using the internal executor: ``` SELECT pg_namespace.oid, nspname FROM pg_catalog.pg_namespace WHERE oid = $1 ``` When the `GenerateConstrainedScans` rule is disabled, this returns no rows and so doesn't apply the cast. The same SQL, not run via an internal executor, but also with `GenerateConstrainedScans` disabled, behaves correctly. Disabling `GenerateConstrainedScans` all the time prevents the cluster from starting. The reason a full scan of pg_namespace doesn't find the OID is because it only checks for schemas in the current database: https://github.com/cockroachdb/cockroach/blob/7b341ffa678e4a22416e2274351fd56f415f5421/pkg/sql/virtual_schema.go#L602 https://github.com/cockroachdb/cockroach/blob/d10c3dd42c3dc40cad82792a30ae47fd2a663f43/pkg/sql/pg_catalog.go#L2099-L2106 https://github.com/cockroachdb/cockroach/blob/a7e9c4a68b81436d1f9382518d4267f74cbdac94/pkg/sql/information_schema.go#L2295-L2296 Whereas with a constrained scan, all descriptors are searched: https://github.com/cockroachdb/cockroach/blob/af6a72a622ae05f3733b5db637403b3eaa9455f1/pkg/sql/catalog/descs/descriptor.go#L168-L175 The correct result is from the constrained scan, because we currently allow cross-database references. Once #55791 is fixed, both results should match. The fix alternatives are: 1. disallow disabling of the `GenerateConstrainedScans` rule for internal SQL 2. turn off generation of REGNAMESPACE expressions in randgen to avoid hitting this problem in tests. The 2nd fix alternative is implemented to avoid losing any of the rule-disabling test coverage provided by the `testing_optimizer_disable_rule_probability` setting. Fixes #98322 100652: cluster-ui: fix cached data invalidation on timescale change r=xinhaoz a=xinhaoz In a prior change, we moved the invalidation of cached data depending on the timescale to the local storage saga for CC. This was so invaldiation would occur after updating the cache. The local storage saga created for the time scale action was not hooked up to fire after the action, thus the data would not have been invalidated. This commit properly subscribes the saga to the update time scale action in CC. Epic: none Release note: None 100760: build: make sure toolchain has correct arguments for linking shared lib r=rail a=rickystewart `geos` has been failing to build without this change since #100313. This fixes it. Epic: none Release note: None Co-authored-by: Mark Sirek <[email protected]> Co-authored-by: Xin Hao Zhang <[email protected]> Co-authored-by: Ricky Stewart <[email protected]>
Casting an OID to REGNAMESPACE runs this SQL using the internal executor: ``` SELECT pg_namespace.oid, nspname FROM pg_catalog.pg_namespace WHERE oid = $1 ``` When the `GenerateConstrainedScans` rule is disabled, this returns no rows and so doesn't apply the cast. The same SQL, not run via an internal executor, but also with `GenerateConstrainedScans` disabled, behaves correctly. Disabling `GenerateConstrainedScans` all the time prevents the cluster from starting. The reason a full scan of pg_namespace doesn't find the OID is because it only checks for schemas in the current database: https://github.com/cockroachdb/cockroach/blob/7b341ffa678e4a22416e2274351fd56f415f5421/pkg/sql/virtual_schema.go#L602 https://github.com/cockroachdb/cockroach/blob/d10c3dd42c3dc40cad82792a30ae47fd2a663f43/pkg/sql/pg_catalog.go#L2099-L2106 https://github.com/cockroachdb/cockroach/blob/a7e9c4a68b81436d1f9382518d4267f74cbdac94/pkg/sql/information_schema.go#L2295-L2296 Whereas with a constrained scan, all descriptors are searched: https://github.com/cockroachdb/cockroach/blob/af6a72a622ae05f3733b5db637403b3eaa9455f1/pkg/sql/catalog/descs/descriptor.go#L168-L175 The correct result is from the constrained scan, because we currently allow cross-database references. Once #55791 is fixed, both results should match. The fix alternatives are: 1. disallow disabling of the `GenerateConstrainedScans` rule for internal SQL 2. turn off generation of REGNAMESPACE expressions in randgen to avoid hitting this problem in tests. The 2nd fix alternative is implemented to avoid losing any of the rule-disabling test coverage provided by the `testing_optimizer_disable_rule_probability` setting. Fixes #98322 Release note: None
Casting an OID to REGNAMESPACE runs this SQL using the internal executor: ``` SELECT pg_namespace.oid, nspname FROM pg_catalog.pg_namespace WHERE oid = $1 ``` When the `GenerateConstrainedScans` rule is disabled, this returns no rows and so doesn't apply the cast. The same SQL, not run via an internal executor, but also with `GenerateConstrainedScans` disabled, behaves correctly. Disabling `GenerateConstrainedScans` all the time prevents the cluster from starting. The reason a full scan of pg_namespace doesn't find the OID is because it only checks for schemas in the current database: https://github.com/cockroachdb/cockroach/blob/7b341ffa678e4a22416e2274351fd56f415f5421/pkg/sql/virtual_schema.go#L602 https://github.com/cockroachdb/cockroach/blob/d10c3dd42c3dc40cad82792a30ae47fd2a663f43/pkg/sql/pg_catalog.go#L2099-L2106 https://github.com/cockroachdb/cockroach/blob/a7e9c4a68b81436d1f9382518d4267f74cbdac94/pkg/sql/information_schema.go#L2295-L2296 Whereas with a constrained scan, all descriptors are searched: https://github.com/cockroachdb/cockroach/blob/af6a72a622ae05f3733b5db637403b3eaa9455f1/pkg/sql/catalog/descs/descriptor.go#L168-L175 The correct result is from the constrained scan, because we currently allow cross-database references. Once #55791 is fixed, both results should match. The fix alternatives are: 1. disallow disabling of the `GenerateConstrainedScans` rule for internal SQL 2. turn off generation of REGNAMESPACE expressions in randgen to avoid hitting this problem in tests. The 2nd fix alternative is implemented to avoid losing any of the rule-disabling test coverage provided by the `testing_optimizer_disable_rule_probability` setting. Fixes #98322 Release note: None
As part of moving toward a more Postgres-compatible world where databases are isolated from each other, we're going to stop supporting references between catalog elements (i.e., tables, types, and schemas) in different databases. The following kinds of references will only be permitted for tables/types in the same database:
In 20.2 we introduced cluster settings to disallow creating new cross-database references for foreign keys, sequence owners, and views by default (#54126).
The proposal is that in 21.1 we'll always disallow the creation of new cross-database references, and have a mechanism to prevent upgrading to 21.2 until users have removed all their existing cross-database references by either moving tables or removing the cross-database schema elements. Specifically, we'd use the long-running migration framework, and have a potentially very long running migration that continually checks whether users have finished removing their cross-database references, and only completes successfully upon confirming that they have.
Other concerns:
ALTER TABLE ... RENAME TO
after 20.2 #51445 (removing the ability to rename tables into a different database) is somewhat related, in that we'll want to preserve a way for users to move their tables across databases to avoid cross-database references, so we probably shouldn't remove this functionality until 21.2. (Note that moving tables across databases isn't a "cross-database reference" in the sense meant by this issue.)Epic: CRDB-1519
Jira issue: CRDB-3631
The text was updated successfully, but these errors were encountered: