From cd30728fb2ed7c367d545fc14ab850b5fa2a4850 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 13 Feb 2012 22:20:27 -0500 Subject: Allow LEAKPROOF functions for better performance of security views. We don't normally allow quals to be pushed down into a view created with the security_barrier option, but functions without side effects are an exception: they're OK. This allows much better performance in common cases, such as when using an equality operator (that might even be indexable). There is an outstanding issue here with the CREATE FUNCTION / ALTER FUNCTION syntax: there's no way to use ALTER FUNCTION to unset the leakproof flag. But I'm committing this as-is so that it doesn't have to be rebased again; we can fix up the grammar in a future commit. KaiGai Kohei, with some wordsmithing by me. --- src/backend/parser/gram.y | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/backend/parser') diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index ac4b4635b94..d79576bcaa3 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -526,7 +526,7 @@ static void processCASbits(int cas_bits, int location, const char *constrType, KEY - LABEL LANGUAGE LARGE_P LAST_P LC_COLLATE_P LC_CTYPE_P LEADING + LABEL LANGUAGE LARGE_P LAST_P LC_COLLATE_P LC_CTYPE_P LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P @@ -6115,6 +6115,10 @@ common_func_opt_item: { $$ = makeDefElem("security", (Node *)makeInteger(FALSE)); } + | LEAKPROOF + { + $$ = makeDefElem("leakproof", (Node *)makeInteger(TRUE)); + } | COST NumericOnly { $$ = makeDefElem("cost", (Node *)$2); @@ -12219,6 +12223,7 @@ unreserved_keyword: | LAST_P | LC_COLLATE_P | LC_CTYPE_P + | LEAKPROOF | LEVEL | LISTEN | LOAD -- cgit v1.2.3