compute_attributes_sql_style(List *options,
List **as,
char **language,
+ bool *windowfunc_p,
char *volatility_p,
bool *strict_p,
bool *security_definer,
ListCell *option;
DefElem *as_item = NULL;
DefElem *language_item = NULL;
+ DefElem *windowfunc_item = NULL;
DefElem *volatility_item = NULL;
DefElem *strict_item = NULL;
DefElem *security_item = NULL;
errmsg("conflicting or redundant options")));
language_item = defel;
}
+ else if (strcmp(defel->defname, "window") == 0)
+ {
+ if (windowfunc_item)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("conflicting or redundant options")));
+ windowfunc_item = defel;
+ }
else if (compute_common_attribute(defel,
&volatility_item,
&strict_item,
}
/* process optional items */
+ if (windowfunc_item)
+ *windowfunc_p = intVal(windowfunc_item->arg);
if (volatility_item)
*volatility_p = interpret_func_volatility(volatility_item);
if (strict_item)
ArrayType *parameterNames;
List *parameterDefaults;
Oid requiredResultType;
- bool isStrict,
+ bool isWindowFunc,
+ isStrict,
security;
char volatility;
ArrayType *proconfig;
get_namespace_name(namespaceId));
/* default attributes */
+ isWindowFunc = false;
isStrict = false;
security = false;
volatility = PROVOLATILE_VOLATILE;
/* override attributes from explicit list */
compute_attributes_sql_style(stmt->options,
&as_clause, &language,
- &volatility, &isStrict, &security,
+ &isWindowFunc, &volatility,
+ &isStrict, &security,
&proconfig, &procost, &prorows);
/* Convert language name to canonical case */
prosrc_str, /* converted to text later */
probin_str, /* converted to text later */
false, /* not an aggregate */
+ isWindowFunc,
security,
isStrict,
volatility,
char *proallargtypes;
char *proargmodes;
char *proargnames;
+ char *proiswindow;
char *provolatile;
char *proisstrict;
char *prosecdef;
"pg_catalog.pg_get_function_arguments(oid) as funcargs, "
"pg_catalog.pg_get_function_identity_arguments(oid) as funciargs, "
"pg_catalog.pg_get_function_result(oid) as funcresult, "
- "provolatile, proisstrict, prosecdef, "
+ "proiswindow, provolatile, proisstrict, prosecdef, "
"proconfig, procost, prorows, "
"(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
"FROM pg_catalog.pg_proc "
appendPQExpBuffer(query,
"SELECT proretset, prosrc, probin, "
"proallargtypes, proargmodes, proargnames, "
+ "false as proiswindow, "
"provolatile, proisstrict, prosecdef, "
"proconfig, procost, prorows, "
"(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
appendPQExpBuffer(query,
"SELECT proretset, prosrc, probin, "
"proallargtypes, proargmodes, proargnames, "
+ "false as proiswindow, "
"provolatile, proisstrict, prosecdef, "
"null as proconfig, 0 as procost, 0 as prorows, "
"(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
"null as proallargtypes, "
"null as proargmodes, "
"proargnames, "
+ "false as proiswindow, "
"provolatile, proisstrict, prosecdef, "
"null as proconfig, 0 as procost, 0 as prorows, "
"(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
"null as proallargtypes, "
"null as proargmodes, "
"null as proargnames, "
+ "false as proiswindow, "
"provolatile, proisstrict, prosecdef, "
"null as proconfig, 0 as procost, 0 as prorows, "
"(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
"null as proallargtypes, "
"null as proargmodes, "
"null as proargnames, "
+ "false as proiswindow, "
"case when proiscachable then 'i' else 'v' end as provolatile, "
"proisstrict, "
- "'f'::boolean as prosecdef, "
+ "false as prosecdef, "
"null as proconfig, 0 as procost, 0 as prorows, "
"(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname "
"FROM pg_proc "
"null as proallargtypes, "
"null as proargmodes, "
"null as proargnames, "
+ "false as proiswindow, "
"case when proiscachable then 'i' else 'v' end as provolatile, "
- "'f'::boolean as proisstrict, "
- "'f'::boolean as prosecdef, "
+ "false as proisstrict, "
+ "false as prosecdef, "
"null as proconfig, 0 as procost, 0 as prorows, "
"(SELECT lanname FROM pg_language WHERE oid = prolang) as lanname "
"FROM pg_proc "
proargnames = PQgetvalue(res, 0, PQfnumber(res, "proargnames"));
funcargs = funciargs = funcresult = NULL;
}
+ proiswindow = PQgetvalue(res, 0, PQfnumber(res, "proiswindow"));
provolatile = PQgetvalue(res, 0, PQfnumber(res, "provolatile"));
proisstrict = PQgetvalue(res, 0, PQfnumber(res, "proisstrict"));
prosecdef = PQgetvalue(res, 0, PQfnumber(res, "prosecdef"));
}
appendPQExpBuffer(q, "\n LANGUAGE %s", fmtId(lanname));
+
+ if (proiswindow[0] == 't')
+ appendPQExpBuffer(q, " WINDOW");
+
if (provolatile[0] != PROVOLATILE_VOLATILE)
{
if (provolatile[0] == PROVOLATILE_IMMUTABLE)