On 02/12/2024 03:15, Tom Lane wrote:
> Michael Paquier <michael@paquier.xyz> writes:
>> If I'm parsing the spec right, the doc mentions in its 5)~6) of the
>> syntax rules in CREATE SCHEMA that non-schema-qualified objects should
>> use the new schema name defined in the CREATE SCHEMA query. So that
>> pretty much settles the rules to use when having a new object that has
>> a reference to a non-qualified object created in the same CREATE
>> SCHEMA query?
> I don't see where you're getting that from? DB2 says that unqualified
> reference names (not to be confused with unqualified creation-target
> names) are taken to be in the new schema, but I don't see any
> corresponding restriction in the spec.
>
> What I do see (11.1 SR 6 in SQL:2021) is:
>
> If <schema path specification> is not specified, then a <schema
> path specification> containing an implementation-defined <schema
> name list> that contains the <schema name> contained in <schema
> name clause> is implicit.
>
> What I read this as is that the "search path" during schema-element
> creation must include at least the new schema, but can also include
> some other schemas as defined by the implementation. That makes
> our behavior compliant, because we can define the other schemas
> as those in the session's prevailing search_path. (DB2's behavior
> is also compliant, but they're defining the path as containing only
> the new schema.)
>
> Also, if SQL intended to constrain the search path for unqualified
> identifiers to be only the new schema, they'd hardly need a concept
> of <schema path specification> at all.
I looked up the original paper (MUN-051) that introduced the <schema
path specification> and it says, "The paper is proposing the use of
paths only to resolve unqualified routine invocations."
That doesn't seem to have been explained much by the rest of the spec,
but it is visible in the definition of <path specification> which says,
"Specify an order for searching for an SQL-invoked routine."
I can find nowhere that says that the path can or cannot be used for
other objects.
--
Vik Fearing