* get_windowfunc_expr - Parse back a WindowFunc node */
| 10307 | * get_windowfunc_expr - Parse back a WindowFunc node |
| 10308 | */ |
| 10309 | static void |
| 10310 | get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context) |
| 10311 | { |
| 10312 | StringInfo buf = context->buf; |
| 10313 | Oid argtypes[FUNC_MAX_ARGS]; |
| 10314 | int nargs; |
| 10315 | List *argnames; |
| 10316 | ListCell *l; |
| 10317 | |
| 10318 | if (list_length(wfunc->args) >= FUNC_MAX_ARGS) |
| 10319 | ereport(ERROR, |
| 10320 | (errcode(ERRCODE_TOO_MANY_ARGUMENTS), |
| 10321 | errmsg("too many arguments"))); |
| 10322 | nargs = 0; |
| 10323 | argnames = NIL; |
| 10324 | foreach(l, wfunc->args) |
| 10325 | { |
| 10326 | Node *arg = (Node *) lfirst(l); |
| 10327 | |
| 10328 | if (IsA(arg, NamedArgExpr)) |
| 10329 | argnames = lappend(argnames, ((NamedArgExpr *) arg)->name); |
| 10330 | argtypes[nargs] = exprType(arg); |
| 10331 | nargs++; |
| 10332 | } |
| 10333 | |
| 10334 | appendStringInfo(buf, "%s(%s", |
| 10335 | generate_function_name(wfunc->winfnoid, nargs, |
| 10336 | argnames, argtypes, |
| 10337 | false, NULL, |
| 10338 | context->special_exprkind), |
| 10339 | wfunc->windistinct ? "DISTINCT " : ""); |
| 10340 | /* winstar can be set only in zero-argument aggregates */ |
| 10341 | if (wfunc->winstar) |
| 10342 | appendStringInfoChar(buf, '*'); |
| 10343 | else |
| 10344 | get_rule_expr((Node *) wfunc->args, context, true); |
| 10345 | |
| 10346 | if (wfunc->aggfilter != NULL) |
| 10347 | { |
| 10348 | appendStringInfoString(buf, ") FILTER (WHERE "); |
| 10349 | get_rule_expr((Node *) wfunc->aggfilter, context, false); |
| 10350 | } |
| 10351 | |
| 10352 | appendStringInfoString(buf, ") OVER "); |
| 10353 | |
| 10354 | foreach(l, context->windowClause) |
| 10355 | { |
| 10356 | WindowClause *wc = (WindowClause *) lfirst(l); |
| 10357 | |
| 10358 | if (wc->winref == wfunc->winref) |
| 10359 | { |
| 10360 | if (wc->name) |
| 10361 | appendStringInfoString(buf, quote_identifier(wc->name)); |
| 10362 | else |
| 10363 | get_rule_windowspec(wc, context->windowTList, context); |
| 10364 | break; |
| 10365 | } |
| 10366 | } |
no test coverage detected