CREATE FUNCTION ... SEARCH { DEFAULT | SYSTEM | SESSION } - Mailing list pgsql-hackers
From | Jeff Davis |
---|---|
Subject | CREATE FUNCTION ... SEARCH { DEFAULT | SYSTEM | SESSION } |
Date | |
Msg-id | 2710f56add351a1ed553efb677408e51b060e67c.camel@j-davis.com Whole thread Raw |
Responses |
Re: CREATE FUNCTION ... SEARCH { DEFAULT | SYSTEM | SESSION }
Re: CREATE FUNCTION ... SEARCH { DEFAULT | SYSTEM | SESSION } Re: CREATE FUNCTION ... SEARCH { DEFAULT | SYSTEM | SESSION } |
List | pgsql-hackers |
The attached patch implements a new SEARCH clause for CREATE FUNCTION. The SEARCH clause controls the search_path used when executing functions that were created without a SET clause. Background: Controlling search_path is critical for the correctness and security of functions. Right now, the author of a function without a SET clause has little ability to control the function's behavior, because even basic operators like "+" involve search_path. This is a big problem for, e.g. functions used in expression indexes which are called by any user with write privileges on the table. Motivation: I'd like to (eventually) get to safe-by-default behavior. In other words, the simplest function declaration should be safe for the most common use cases. To get there, we need some way to explicitly specify the less common cases. Right now there's no way for the function author to indicate that a function intends to use the session's search path. We also need an easier way to specify that the user wants a safe search_path ("SET search_path = pg_catalog, pg_temp" is arcane). And when we know more about the user's actual intent, then it will be easier to either form a transition plan to push users into the safer behavior, or at least warn strongly when the user is doing something dangerous (i.e. using a function that depends on the session's search path as part of an expression index). Today, the only information we have about the user's intent is the presence or absence of a "SET search_path" clause, which is not a strong signal. Proposal: Add SEARCH { DEFAULT | SYSTEM | SESSION } clause to CREATE/ALTER function. * SEARCH DEFAULT is the same as no SEARCH clause at all, and ends up stored in the catalog as prosearch='d'. * SEARCH SYSTEM means that we switch to the safe search path of "pg_catalog, pg_temp" when executing the function. Stored as prosearch='y'. * SEARCH SESSION means that we don't switch the search_path when executing the function, and it's inherited from the session. Stored as prosearch='e'. Regardless of the SEARCH clause, a "SET search_path" clause will override it. The SEARCH clause only matters when "SET search_path" is not there. Additionally provide a GUC, defaulting to false for compatibility, that can interpret prosearch='d' as if it were prosearch='y'. It could help provide a transition path. I know there's a strong reluctance to adding these kinds of GUCs; I can remove it and I think the patch will still be worthwhile. Perhaps there are alternatives that could help with migration at pg_dump time instead? Benefits: 1. The user can be more explicit about their actual intent. Do they want safety and consistency? Or the flexibility of using the session's search_path? 2. We can more accurately serve the user's intent. For instance, the safe search_path of "pg_catalog, pg_temp" is arcane and seems to be there just because we don't have a way to specify that pg_temp be excluded entirely. But perhaps in the future we *do* want to exclude pg_temp entirely. Knowing that the user just wants "SEARCH SYSTEM" allows us some freedom to do that. 3. Users can be forward-compatible by specifying the functions that really do need to use the session's search path as SEARCH SESSION, so that they will never be broken in the future. That gives us a cleaner path toward making the default behavior safe. -- Jeff Davis PostgreSQL Contributor Team - AWS
Attachment
pgsql-hackers by date: