📄 pl_gram.c
字号:
var->isconst = plpgsql_yyvsp[-3].ival; var->notnull = plpgsql_yyvsp[-1].ival; var->default_val = plpgsql_yyvsp[0].expr; plpgsql_adddatum((PLpgSQL_datum *)var); plpgsql_ns_additem(PLPGSQL_NSTYPE_VAR, var->varno, plpgsql_yyvsp[-4].varname.name); } else { /* Composite type --- treat as rowtype */ PLpgSQL_row *row; row = plpgsql_build_rowtype(plpgsql_yyvsp[-2].dtype->typrelid); row->dtype = PLPGSQL_DTYPE_ROW; row->refname = plpgsql_yyvsp[-4].varname.name; row->lineno = plpgsql_yyvsp[-4].varname.lineno; if (plpgsql_yyvsp[-3].ival) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("rowtype variable cannot be CONSTANT"))); if (plpgsql_yyvsp[-1].ival) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("rowtype variable cannot be NOT NULL"))); if (plpgsql_yyvsp[0].expr != NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("default value for rowtype variable is not supported"))); plpgsql_adddatum((PLpgSQL_datum *)row); plpgsql_ns_additem(PLPGSQL_NSTYPE_ROW, row->rowno, plpgsql_yyvsp[-4].varname.name); } } break; case 22:#line 362 "gram.y" { PLpgSQL_rec *var; var = malloc(sizeof(PLpgSQL_rec)); var->dtype = PLPGSQL_DTYPE_REC; var->refname = plpgsql_yyvsp[-2].varname.name; var->lineno = plpgsql_yyvsp[-2].varname.lineno; plpgsql_adddatum((PLpgSQL_datum *)var); plpgsql_ns_additem(PLPGSQL_NSTYPE_REC, var->recno, plpgsql_yyvsp[-2].varname.name); } break; case 23:#line 376 "gram.y" { plpgsql_yyvsp[-1].row->dtype = PLPGSQL_DTYPE_ROW; plpgsql_yyvsp[-1].row->refname = plpgsql_yyvsp[-2].varname.name; plpgsql_yyvsp[-1].row->lineno = plpgsql_yyvsp[-2].varname.lineno; plpgsql_adddatum((PLpgSQL_datum *)plpgsql_yyvsp[-1].row); plpgsql_ns_additem(PLPGSQL_NSTYPE_ROW, plpgsql_yyvsp[-1].row->rowno, plpgsql_yyvsp[-2].varname.name); } break; case 24:#line 386 "gram.y" { plpgsql_ns_additem(plpgsql_yyvsp[-1].nsitem->itemtype, plpgsql_yyvsp[-1].nsitem->itemno, plpgsql_yyvsp[-4].varname.name); } break; case 25:#line 391 "gram.y" { plpgsql_ns_rename(plpgsql_yyvsp[-3].str, plpgsql_yyvsp[-1].str); } break; case 26:#line 395 "gram.y" { plpgsql_ns_push(NULL); } break; case 27:#line 397 "gram.y" { PLpgSQL_var *new; PLpgSQL_expr *curname_def; char buf[1024]; char *cp1; char *cp2; /* pop local namespace for cursor args */ plpgsql_ns_pop(); new = malloc(sizeof(PLpgSQL_var)); memset(new, 0, sizeof(PLpgSQL_var)); curname_def = malloc(sizeof(PLpgSQL_expr)); memset(curname_def, 0, sizeof(PLpgSQL_expr)); new->dtype = PLPGSQL_DTYPE_VAR; new->refname = plpgsql_yyvsp[-5].varname.name; new->lineno = plpgsql_yyvsp[-5].varname.lineno; curname_def->dtype = PLPGSQL_DTYPE_EXPR; strcpy(buf, "SELECT '"); cp1 = new->refname; cp2 = buf + strlen(buf); while (*cp1 != '\0') { if (*cp1 == '\\' || *cp1 == '\'') *cp2++ = '\\'; *cp2++ = *cp1++; } strcpy(cp2, "'::refcursor"); curname_def->query = strdup(buf); new->default_val = curname_def; new->datatype = plpgsql_parse_datatype("refcursor"); new->cursor_explicit_expr = plpgsql_yyvsp[0].expr; if (plpgsql_yyvsp[-2].row == NULL) new->cursor_explicit_argrow = -1; else new->cursor_explicit_argrow = plpgsql_yyvsp[-2].row->rowno; plpgsql_adddatum((PLpgSQL_datum *)new); plpgsql_ns_additem(PLPGSQL_NSTYPE_VAR, new->varno, plpgsql_yyvsp[-5].varname.name); } break; case 28:#line 446 "gram.y" { PLpgSQL_expr *query; plpgsql_ns_setlocal(false); query = read_sql_stmt(""); plpgsql_ns_setlocal(true); plpgsql_yyval.expr = query; } break; case 29:#line 458 "gram.y" { plpgsql_yyval.row = NULL; } break; case 30:#line 462 "gram.y" { /* Copy the temp arrays to malloc'd storage */ int nfields = plpgsql_yyvsp[-1].row->nfields; char **ftmp; int *vtmp; ftmp = malloc(nfields * sizeof(char *)); vtmp = malloc(nfields * sizeof(int)); memcpy(ftmp, plpgsql_yyvsp[-1].row->fieldnames, nfields * sizeof(char *)); memcpy(vtmp, plpgsql_yyvsp[-1].row->varnos, nfields * sizeof(int)); pfree((char *)(plpgsql_yyvsp[-1].row->fieldnames)); pfree((char *)(plpgsql_yyvsp[-1].row->varnos)); plpgsql_yyvsp[-1].row->fieldnames = ftmp; plpgsql_yyvsp[-1].row->varnos = vtmp; plpgsql_adddatum((PLpgSQL_datum *)plpgsql_yyvsp[-1].row); plpgsql_yyval.row = plpgsql_yyvsp[-1].row; } break; case 31:#line 486 "gram.y" { PLpgSQL_row *new; new = malloc(sizeof(PLpgSQL_row)); memset(new, 0, sizeof(PLpgSQL_row)); new->dtype = PLPGSQL_DTYPE_ROW; new->refname = strdup("*internal*"); new->lineno = plpgsql_scanner_lineno(); new->rowtupdesc = NULL; /* * We make temporary fieldnames/varnos arrays that * are much bigger than necessary. We will resize * them to just the needed size in the * decl_cursor_args production. */ new->fieldnames = palloc(1024 * sizeof(char *)); new->varnos = palloc(1024 * sizeof(int)); new->nfields = 1; new->fieldnames[0] = plpgsql_yyvsp[0].var->refname; new->varnos[0] = plpgsql_yyvsp[0].var->varno; plpgsql_yyval.row = new; } break; case 32:#line 512 "gram.y" { int i = plpgsql_yyvsp[-2].row->nfields++; plpgsql_yyvsp[-2].row->fieldnames[i] = plpgsql_yyvsp[0].var->refname; plpgsql_yyvsp[-2].row->varnos[i] = plpgsql_yyvsp[0].var->varno; plpgsql_yyval.row = plpgsql_yyvsp[-2].row; } break; case 33:#line 523 "gram.y" { PLpgSQL_var *new; new = malloc(sizeof(PLpgSQL_var)); memset(new, 0, sizeof(PLpgSQL_var)); new->dtype = PLPGSQL_DTYPE_VAR; new->refname = plpgsql_yyvsp[-1].varname.name; new->lineno = plpgsql_yyvsp[-1].varname.lineno; new->datatype = plpgsql_yyvsp[0].dtype; new->isconst = false; new->notnull = false; plpgsql_adddatum((PLpgSQL_datum *)new); plpgsql_ns_additem(PLPGSQL_NSTYPE_VAR, new->varno, plpgsql_yyvsp[-1].varname.name); plpgsql_yyval.var = new; } break; case 36:#line 549 "gram.y" { char *name; PLpgSQL_nsitem *nsi; plpgsql_convert_ident(plpgsql_yytext, &name, 1); if (name[0] != '$') plpgsql_yyerror("only positional parameters may be aliased"); plpgsql_ns_setlocal(false); nsi = plpgsql_ns_lookup(name, NULL); if (nsi == NULL) { plpgsql_error_lineno = plpgsql_scanner_lineno(); ereport(ERROR, (errcode(ERRCODE_UNDEFINED_PARAMETER), errmsg("function has no parameter \"%s\"", name))); } plpgsql_ns_setlocal(true); pfree(name); plpgsql_yyval.nsitem = nsi; } break; case 37:#line 577 "gram.y" { plpgsql_yyval.row = plpgsql_yylval.row; } break; case 38:#line 583 "gram.y" { char *name; plpgsql_convert_ident(plpgsql_yytext, &name, 1); /* name should be malloc'd for use as varname */ plpgsql_yyval.varname.name = strdup(name); plpgsql_yyval.varname.lineno = plpgsql_scanner_lineno(); pfree(name); } break; case 39:#line 595 "gram.y" { char *name; plpgsql_convert_ident(plpgsql_yytext, &name, 1); /* the result must be palloc'd, see plpgsql_ns_rename */ plpgsql_yyval.str = name; } break; case 40:#line 605 "gram.y" { plpgsql_yyval.ival = 0; } break; case 41:#line 607 "gram.y" { plpgsql_yyval.ival = 1; } break; case 42:#line 611 "gram.y" { /* * If there's a lookahead token, read_datatype * should consume it. */ plpgsql_yyval.dtype = read_datatype(plpgsql_yychar); plpgsql_yyclearin; } break; case 43:#line 622 "gram.y" { plpgsql_yyval.ival = 0; } break; case 44:#line 624 "gram.y" { plpgsql_yyval.ival = 1; } break; case 45:#line 628 "gram.y" { plpgsql_yyval.expr = NULL; } break; case 46:#line 630 "gram.y" { int tok; int lno; PLpgSQL_dstring ds; PLpgSQL_expr *expr; lno = plpgsql_scanner_lineno(); expr = malloc(sizeof(PLpgSQL_expr)); plpgsql_dstring_init(&ds); plpgsql_dstring_append(&ds, "SELECT "); expr->dtype = PLPGSQL_DTYPE_EXPR; expr->plan = NULL; expr->nparams = 0; tok = plpgsql_yylex(); switch (tok) { case 0: plpgsql_yyerror("unexpected end of function"); case K_NULL: if (plpgsql_yylex() != ';') plpgsql_yyerror("expected \";\" after \"NULL\""); free(expr); plpgsql_dstring_free(&ds); plpgsql_yyval.expr = NULL; break; default: plpgsql_dstring_append(&ds, plpgsql_yytext); while ((tok = plpgsql_yylex()) != ';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -