⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pl_gram.c

📁 PostgreSQL7.4.6 for Linux
💻 C
📖 第 1 页 / 共 5 页
字号:
							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 + -