aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y68
-rw-r--r--src/backend/parser/parse_relation.c40
2 files changed, 37 insertions, 71 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 53759b80296..5c77aebfe62 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.355 2002/08/04 19:48:09 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.356 2002/08/05 02:30:50 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -203,7 +203,7 @@ static void doNegateFloat(Value *v);
%type <chr> TriggerOneEvent
%type <list> stmtblock, stmtmulti,
- OptTableElementList, OptInherit, definition,
+ OptTableElementList, TableElementList, OptInherit, definition,
opt_distinct, opt_definition, func_args,
func_args_list, func_as, createfunc_opt_list
oper_argtypes, RuleActionList, RuleActionMulti,
@@ -216,7 +216,7 @@ static void doNegateFloat(Value *v);
insert_target_list, def_list, opt_indirection,
group_clause, TriggerFuncArgs, select_limit,
opt_select_limit, opclass_item_list, trans_options,
- tableFuncElementList
+ TableFuncElementList, OptTableFuncElementList
%type <range> into_clause, OptTempTableName
@@ -257,8 +257,8 @@ static void doNegateFloat(Value *v);
%type <vsetstmt> set_rest
-%type <node> OptTableElement, ConstraintElem, tableFuncElement
-%type <node> columnDef, tableFuncColumnDef
+%type <node> TableElement, ConstraintElem, TableFuncElement
+%type <node> columnDef
%type <defelt> def_elem
%type <node> def_arg, columnElem, where_clause, insert_column_item,
a_expr, b_expr, c_expr, r_expr, AexprConst,
@@ -1428,24 +1428,22 @@ OptTemp: TEMPORARY { $$ = TRUE; }
;
OptTableElementList:
- OptTableElementList ',' OptTableElement
+ TableElementList { $$ = $1; }
+ | /*EMPTY*/ { $$ = NIL; }
+ ;
+
+TableElementList:
+ TableElementList ',' TableElement
{
- if ($3 != NULL)
- $$ = lappend($1, $3);
- else
- $$ = $1;
+ $$ = lappend($1, $3);
}
- | OptTableElement
+ | TableElement
{
- if ($1 != NULL)
- $$ = makeList1($1);
- else
- $$ = NIL;
+ $$ = makeList1($1);
}
- | /*EMPTY*/ { $$ = NIL; }
;
-OptTableElement:
+TableElement:
columnDef { $$ = $1; }
| TableLikeClause { $$ = $1; }
| TableConstraint { $$ = $1; }
@@ -1877,7 +1875,7 @@ CreateSeqStmt:
;
OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); }
- | { $$ = NIL; }
+ | /*EMPTY*/ { $$ = NIL; }
;
OptSeqElem: CACHE NumericOnly
@@ -4452,14 +4450,14 @@ table_ref: relation_expr
n->coldeflist = NIL;
$$ = (Node *) n;
}
- | func_table AS '(' tableFuncElementList ')'
+ | func_table AS '(' OptTableFuncElementList ')'
{
RangeFunction *n = makeNode(RangeFunction);
n->funccallnode = $1;
n->coldeflist = $4;
$$ = (Node *) n;
}
- | func_table AS ColId '(' tableFuncElementList ')'
+ | func_table AS ColId '(' OptTableFuncElementList ')'
{
RangeFunction *n = makeNode(RangeFunction);
Alias *a = makeNode(Alias);
@@ -4469,7 +4467,7 @@ table_ref: relation_expr
n->coldeflist = $5;
$$ = (Node *) n;
}
- | func_table ColId '(' tableFuncElementList ')'
+ | func_table ColId '(' OptTableFuncElementList ')'
{
RangeFunction *n = makeNode(RangeFunction);
Alias *a = makeNode(Alias);
@@ -4733,29 +4731,23 @@ where_clause:
;
-tableFuncElementList:
- tableFuncElementList ',' tableFuncElement
+OptTableFuncElementList:
+ TableFuncElementList { $$ = $1; }
+ | /*EMPTY*/ { $$ = NIL; }
+ ;
+
+TableFuncElementList:
+ TableFuncElementList ',' TableFuncElement
{
- if ($3 != NULL)
- $$ = lappend($1, $3);
- else
- $$ = $1;
+ $$ = lappend($1, $3);
}
- | tableFuncElement
+ | TableFuncElement
{
- if ($1 != NULL)
- $$ = makeList1($1);
- else
- $$ = NIL;
+ $$ = makeList1($1);
}
- | /*EMPTY*/ { $$ = NIL; }
- ;
-
-tableFuncElement:
- tableFuncColumnDef { $$ = $1; }
;
-tableFuncColumnDef: ColId Typename
+TableFuncElement: ColId Typename
{
ColumnDef *n = makeNode(ColumnDef);
n->colname = $1;
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index 6a4bda5d62b..872c03ca9f5 100644
--- a/src/backend/parser/parse_relation.c
+++ b/src/backend/parser/parse_relation.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.72 2002/08/04 19:48:10 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.73 2002/08/05 02:30:50 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -727,7 +727,7 @@ addRangeTableEntryForFunction(ParseState *pstate,
* Now determine if the function returns a simple or composite type,
* and check/add column aliases.
*/
- functyptype = typeid_get_typtype(funcrettype);
+ functyptype = get_typtype(funcrettype);
if (functyptype == 'c')
{
@@ -776,7 +776,7 @@ addRangeTableEntryForFunction(ParseState *pstate,
elog(ERROR, "Invalid return relation specified for function %s",
funcname);
}
- else if (functyptype == 'b')
+ else if (functyptype == 'b' || functyptype == 'd')
{
/*
* Must be a base data type, i.e. scalar.
@@ -1080,7 +1080,7 @@ expandRTE(ParseState *pstate, RangeTblEntry *rte,
{
/* Function RTE */
Oid funcrettype = exprType(rte->funcexpr);
- char functyptype = typeid_get_typtype(funcrettype);
+ char functyptype = get_typtype(funcrettype);
List *coldeflist = rte->coldeflist;
/*
@@ -1091,7 +1091,6 @@ expandRTE(ParseState *pstate, RangeTblEntry *rte,
Oid funcrelid = typeidTypeRelid(funcrettype);
if (OidIsValid(funcrelid))
{
-
/*
* Composite data type, i.e. a table's row type
* Same as ordinary relation RTE
@@ -1142,7 +1141,7 @@ expandRTE(ParseState *pstate, RangeTblEntry *rte,
elog(ERROR, "Invalid return relation specified"
" for function");
}
- else if (functyptype == 'b')
+ else if (functyptype == 'b' || functyptype == 'd')
{
/*
* Must be a base data type, i.e. scalar
@@ -1392,7 +1391,7 @@ get_rte_attribute_type(RangeTblEntry *rte, AttrNumber attnum,
{
/* Function RTE */
Oid funcrettype = exprType(rte->funcexpr);
- char functyptype = typeid_get_typtype(funcrettype);
+ char functyptype = get_typtype(funcrettype);
List *coldeflist = rte->coldeflist;
/*
@@ -1436,7 +1435,7 @@ get_rte_attribute_type(RangeTblEntry *rte, AttrNumber attnum,
elog(ERROR, "Invalid return relation specified"
" for function");
}
- else if (functyptype == 'b')
+ else if (functyptype == 'b' || functyptype == 'd')
{
/*
* Must be a base data type, i.e. scalar
@@ -1687,28 +1686,3 @@ warnAutoRange(ParseState *pstate, RangeVar *relation)
pstate->parentParseState != NULL ? " in subquery" : "",
relation->relname);
}
-
-char
-typeid_get_typtype(Oid typeid)
-{
- HeapTuple typeTuple;
- Form_pg_type typeStruct;
- char result;
-
- /*
- * determine if the function returns a simple, named composite,
- * or anonymous composite type
- */
- typeTuple = SearchSysCache(TYPEOID,
- ObjectIdGetDatum(typeid),
- 0, 0, 0);
- if (!HeapTupleIsValid(typeTuple))
- elog(ERROR, "cache lookup for type %u failed", typeid);
- typeStruct = (Form_pg_type) GETSTRUCT(typeTuple);
-
- result = typeStruct->typtype;
-
- ReleaseSysCache(typeTuple);
-
- return result;
-}