Commit b37bc65f authored by Bruce Momjian's avatar Bruce Momjian

Creates the SubLink structure, and the Query->hasSubLink field,

with supporting code.

Creates SubLink node in gram.y.

psql.c patch for newatttypmod field.
parent c65ea0e0
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.31 1998/01/16 23:19:56 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.32 1998/01/17 04:53:07 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -892,6 +892,28 @@ _copyAggreg(Aggreg *from) ...@@ -892,6 +892,28 @@ _copyAggreg(Aggreg *from)
return newnode; return newnode;
} }
/* ----------------
* _copySubLink
* ----------------
*/
static SubLink *
_copySubLink(SubLink *from)
{
SubLink *newnode = makeNode(SubLink);
/* ----------------
* copy remainder of node
* ----------------
*/
newnode->subLinkType = from->subLinkType;
newnode->useor = from->useor;
Node_Copy(from, newnode, lefthand);
Node_Copy(from, newnode, oper);
Node_Copy(from, newnode, subselect);
return newnode;
}
static Array * static Array *
_copyArray(Array *from) _copyArray(Array *from)
{ {
...@@ -1517,6 +1539,7 @@ _copyQuery(Query *from) ...@@ -1517,6 +1539,7 @@ _copyQuery(Query *from)
Node_Copy(from, newnode, havingQual); Node_Copy(from, newnode, havingQual);
newnode->hasAggs = from->hasAggs; newnode->hasAggs = from->hasAggs;
newnode->hasSubLinks = from->hasSubLinks;
if (from->unionClause) if (from->unionClause)
{ {
...@@ -1673,6 +1696,9 @@ copyObject(void *from) ...@@ -1673,6 +1696,9 @@ copyObject(void *from)
case T_Aggreg: case T_Aggreg:
retval = _copyAggreg(from); retval = _copyAggreg(from);
break; break;
case T_SubLink:
retval = _copySubLink(from);
break;
/* /*
* RELATION NODES * RELATION NODES
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.22 1998/01/16 23:19:59 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.23 1998/01/17 04:53:09 momjian Exp $
* *
* NOTES * NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which * Every (plan) node in POSTGRES has an associated "out" routine which
...@@ -230,6 +230,8 @@ _outQuery(StringInfo str, Query *node) ...@@ -230,6 +230,8 @@ _outQuery(StringInfo str, Query *node)
_outNode(str, node->havingQual); _outNode(str, node->havingQual);
appendStringInfo(str, " :hasAggs "); appendStringInfo(str, " :hasAggs ");
appendStringInfo(str, (node->hasAggs ? "true" : "false")); appendStringInfo(str, (node->hasAggs ? "true" : "false"));
appendStringInfo(str, " :hasSubLinks ");
appendStringInfo(str, (node->hasSubLinks ? "true" : "false"));
appendStringInfo(str, " :unionClause "); appendStringInfo(str, " :unionClause ");
_outNode(str, node->unionClause); _outNode(str, node->unionClause);
} }
...@@ -753,6 +755,27 @@ _outAggreg(StringInfo str, Aggreg *node) ...@@ -753,6 +755,27 @@ _outAggreg(StringInfo str, Aggreg *node)
appendStringInfo(str, node->usenulls ? "true" : "false"); appendStringInfo(str, node->usenulls ? "true" : "false");
} }
/*
* SubLink
*/
static void
_outSubLink(StringInfo str, SubLink *node)
{
char buf[500];
appendStringInfo(str, "SUBLINK");
sprintf(buf, " :subLinkType %d ", node->subLinkType);
appendStringInfo(str, buf);
appendStringInfo(str, " :useor ");
appendStringInfo(str, node->useor ? "true" : "false");
appendStringInfo(str, " :lefthand ");
_outNode(str, node->lefthand);
appendStringInfo(str, " :oper ");
_outNode(str, node->oper);
appendStringInfo(str, " :subselect ");
_outNode(str, node->subselect);
}
/* /*
* Array is a subclass of Expr * Array is a subclass of Expr
*/ */
...@@ -1648,6 +1671,9 @@ _outNode(StringInfo str, void *obj) ...@@ -1648,6 +1671,9 @@ _outNode(StringInfo str, void *obj)
case T_Aggreg: case T_Aggreg:
_outAggreg(str, obj); _outAggreg(str, obj);
break; break;
case T_SubLink:
_outSubLink(str, obj);
break;
case T_Array: case T_Array:
_outArray(str, obj); _outArray(str, obj);
break; break;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.18 1998/01/15 18:59:31 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.19 1998/01/17 04:53:11 momjian Exp $
* *
* NOTES * NOTES
* Most of the read functions for plan nodes are tested. (In fact, they * Most of the read functions for plan nodes are tested. (In fact, they
...@@ -156,6 +156,10 @@ _readQuery() ...@@ -156,6 +156,10 @@ _readQuery()
token = lsptok(NULL, &length); /* get hasAggs */ token = lsptok(NULL, &length); /* get hasAggs */
local_node->hasAggs = (token[0] == 't') ? true : false; local_node->hasAggs = (token[0] == 't') ? true : false;
token = lsptok(NULL, &length); /* skip the :hasSubLinks */
token = lsptok(NULL, &length); /* get hasSubLinks */
local_node->hasSubLinks = (token[0] == 't') ? true : false;
token = lsptok(NULL, &length); /* skip :unionClause */ token = lsptok(NULL, &length); /* skip :unionClause */
local_node->unionClause = nodeRead(true); local_node->unionClause = nodeRead(true);
...@@ -1151,6 +1155,41 @@ _readAggreg() ...@@ -1151,6 +1155,41 @@ _readAggreg()
return (local_node); return (local_node);
} }
/* ----------------
* _readSubLink
*
* SubLink is a subclass of Node
* ----------------
*/
static SubLink *
_readSubLink()
{
SubLink *local_node;
char *token;
int length;
local_node = makeNode(SubLink);
token = lsptok(NULL, &length); /* eat :subLinkType */
token = lsptok(NULL, &length); /* get subLinkType */
local_node->subLinkType = atoi(token);
token = lsptok(NULL, &length); /* eat :useor */
token = lsptok(NULL, &length); /* get useor */
local_node->useor = (token[0] == 't') ? true : false;
token = lsptok(NULL, &length); /* eat :lefthand */
local_node->lefthand = nodeRead(true); /* now read it */
token = lsptok(NULL, &length); /* eat :oper */
local_node->oper = nodeRead(true); /* now read it */
token = lsptok(NULL, &length); /* eat :subselect */
local_node->subselect = nodeRead(true); /* now read it */
return (local_node);
}
/* /*
* Stuff from execnodes.h * Stuff from execnodes.h
*/ */
...@@ -1971,6 +2010,10 @@ parsePlanString(void) ...@@ -1971,6 +2010,10 @@ parsePlanString(void)
{ {
return_value = _readAggreg(); return_value = _readAggreg();
} }
else if (!strncmp(token, "SUBLINK", 6))
{
return_value = _readSubLink();
}
else if (!strncmp(token, "AGG", 3)) else if (!strncmp(token, "AGG", 3))
{ {
return_value = _readAgg(); return_value = _readAgg();
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.91 1998/01/16 23:20:14 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.92 1998/01/17 04:53:16 momjian Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -63,7 +63,6 @@ extern List *parsetree; ...@@ -63,7 +63,6 @@ extern List *parsetree;
static char *xlateSqlType(char *); static char *xlateSqlType(char *);
static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr); static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
static Node *makeRowExpr(char *opr, List *largs, List *rargs);
void mapTargetColumns(List *source, List *target); void mapTargetColumns(List *source, List *target);
static List *makeConstantList( A_Const *node); static List *makeConstantList( A_Const *node);
static char *FlattenStringList(List *list); static char *FlattenStringList(List *list);
...@@ -2151,9 +2150,9 @@ insert_rest: VALUES '(' res_target_list2 ')' ...@@ -2151,9 +2150,9 @@ insert_rest: VALUES '(' res_target_list2 ')'
$$->unique = NULL; $$->unique = NULL;
$$->targetList = $3; $$->targetList = $3;
$$->fromClause = NIL; $$->fromClause = NIL;
$$->whereClause = NIL; $$->whereClause = NULL;
$$->groupClause = NIL; $$->groupClause = NIL;
$$->havingClause = NIL; $$->havingClause = NULL;
$$->unionClause = NIL; $$->unionClause = NIL;
} }
| SELECT opt_unique res_target_list2 | SELECT opt_unique res_target_list2
...@@ -2869,28 +2868,41 @@ a_expr_or_null: a_expr ...@@ -2869,28 +2868,41 @@ a_expr_or_null: a_expr
*/ */
row_expr: '(' row_descriptor ')' IN '(' SubSelect ')' row_expr: '(' row_descriptor ')' IN '(' SubSelect ')'
{ {
$$ = NULL; SubLink *n = makeNode(SubLink);
n->lefthand = $2;
n->subLinkType = IN_SUBLINK;
n->subselect = $6;
$$ = (Node *)n;
} }
| '(' row_descriptor ')' NOT IN '(' SubSelect ')' | '(' row_descriptor ')' NOT IN '(' SubSelect ')'
{ {
$$ = NULL; SubLink *n = makeNode(SubLink);
} n->lefthand = $2;
| '(' row_descriptor ')' '=' '(' row_descriptor ')' n->subLinkType = NOTIN_SUBLINK;
{ n->subselect = $7;
$$ = makeRowExpr("=", $2, $6); $$ = (Node *)n;
}
| '(' row_descriptor ')' '<' '(' row_descriptor ')'
{
$$ = makeRowExpr("<", $2, $6);
} }
| '(' row_descriptor ')' '>' '(' row_descriptor ')' /* We accept all Operators? */
| '(' row_descriptor ')' Op '(' SubSelect ')'
{ {
$$ = makeRowExpr("<", $2, $6); SubLink *n = makeNode(SubLink);
n->lefthand = $2;
n->subLinkType = OPER_SUBLINK;
n->oper = lcons($4, NIL);
n->subselect = $6;
$$ = (Node *)n;
} }
/* Do we need this?
| '(' row_descriptor ')' Op '(' row_descriptor ')' | '(' row_descriptor ')' Op '(' row_descriptor ')'
{ {
$$ = makeRowExpr($4, $2, $6); SubLink *n = makeNode(SubLink);
n->lefthand = $2;
n->subLinkType = OPER_SUBLINK;
n->oper = lcons($4, NIL);
n->subselect = $6;
$$ = (Node *)n;
} }
*/
; ;
row_descriptor: row_list ',' a_expr row_descriptor: row_list ',' a_expr
...@@ -3116,8 +3128,12 @@ a_expr: attr opt_indirection ...@@ -3116,8 +3128,12 @@ a_expr: attr opt_indirection
*/ */
| EXISTS '(' SubSelect ')' | EXISTS '(' SubSelect ')'
{ {
elog(ERROR,"EXISTS not yet implemented"); SubLink *n = makeNode(SubLink);
$$ = $3; n->lefthand = NIL;
n->subLinkType = EXISTS_SUBLINK;
n->oper = NIL;
n->subselect = $3;
$$ = (Node *)n;
} }
| EXTRACT '(' extract_list ')' | EXTRACT '(' extract_list ')'
{ {
...@@ -3231,9 +3247,25 @@ a_expr: attr opt_indirection ...@@ -3231,9 +3247,25 @@ a_expr: attr opt_indirection
makeA_Expr(OP, ">", $1, $6)); makeA_Expr(OP, ">", $1, $6));
} }
| a_expr IN { saved_In_Expr = $1; } '(' in_expr ')' | a_expr IN { saved_In_Expr = $1; } '(' in_expr ')'
{ $$ = $5; } {
if (nodeTag($5) == T_SubLink)
{
((SubLink *)$5)->lefthand = lcons($1, NIL);
((SubLink *)$5)->subLinkType = IN_SUBLINK;
$$ = (Node *)$5;
}
else $$ = $5;
}
| a_expr NOT IN { saved_In_Expr = $1; } '(' not_in_expr ')' | a_expr NOT IN { saved_In_Expr = $1; } '(' not_in_expr ')'
{ $$ = $6; } {
if (nodeTag($6) == T_SubLink)
{
((SubLink *)$6)->lefthand = lcons($1, NIL);
((SubLink *)$6)->subLinkType = NOTIN_SUBLINK;
$$ = (Node *)$6;
}
else $$ = $6;
}
| a_expr AND a_expr | a_expr AND a_expr
{ $$ = makeA_Expr(AND, NULL, $1, $3); } { $$ = makeA_Expr(AND, NULL, $1, $3); }
| a_expr OR a_expr | a_expr OR a_expr
...@@ -3446,8 +3478,9 @@ trim_list: a_expr FROM expr_list ...@@ -3446,8 +3478,9 @@ trim_list: a_expr FROM expr_list
in_expr: SubSelect in_expr: SubSelect
{ {
elog(ERROR,"IN (SUBSELECT) not yet implemented"); SubLink *n = makeNode(SubLink);
$$ = $1; n->subselect = $1;
$$ = (Node *)n;
} }
| in_expr_nodes | in_expr_nodes
{ $$ = $1; } { $$ = $1; }
...@@ -3463,8 +3496,9 @@ in_expr_nodes: AexprConst ...@@ -3463,8 +3496,9 @@ in_expr_nodes: AexprConst
not_in_expr: SubSelect not_in_expr: SubSelect
{ {
elog(ERROR,"NOT IN (SUBSELECT) not yet implemented"); SubLink *n = makeNode(SubLink);
$$ = $1; n->subselect = $1;
$$ = (Node *)n;
} }
| not_in_expr_nodes | not_in_expr_nodes
{ $$ = $1; } { $$ = $1; }
...@@ -3807,68 +3841,6 @@ makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr) ...@@ -3807,68 +3841,6 @@ makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr)
return (Node *)a; return (Node *)a;
} }
/* makeRowExpr()
* Generate separate operator nodes for a single row descriptor expression.
* Perhaps this should go deeper in the parser someday... - thomas 1997-12-22
*/
static Node *
makeRowExpr(char *opr, List *largs, List *rargs)
{
Node *expr = NULL;
Node *larg, *rarg;
if (length(largs) != length(rargs))
elog(ERROR,"Unequal number of entries in row expression");
if (lnext(largs) != NIL)
expr = makeRowExpr(opr,lnext(largs),lnext(rargs));
larg = lfirst(largs);
rarg = lfirst(rargs);
if ((strcmp(opr, "=") == 0)
|| (strcmp(opr, "<") == 0)
|| (strcmp(opr, "<=") == 0)
|| (strcmp(opr, ">") == 0)
|| (strcmp(opr, ">=") == 0))
{
if (expr == NULL)
expr = makeA_Expr(OP, opr, larg, rarg);
else
expr = makeA_Expr(AND, NULL, expr, makeA_Expr(OP, opr, larg, rarg));
}
else if (strcmp(opr, "<>") == 0)
{
if (expr == NULL)
expr = makeA_Expr(OP, opr, larg, rarg);
else
expr = makeA_Expr(OR, NULL, expr, makeA_Expr(OP, opr, larg, rarg));
}
else
{
elog(ERROR,"Operator '%s' not implemented for row expressions",opr);
}
#if FALSE
while ((largs != NIL) && (rargs != NIL))
{
larg = lfirst(largs);
rarg = lfirst(rargs);
if (expr == NULL)
expr = makeA_Expr(OP, opr, larg, rarg);
else
expr = makeA_Expr(AND, NULL, expr, makeA_Expr(OP, opr, larg, rarg));
largs = lnext(largs);
rargs = lnext(rargs);
}
pprint(expr);
#endif
return expr;
} /* makeRowExpr() */
void void
mapTargetColumns(List *src, List *dst) mapTargetColumns(List *src, List *dst)
{ {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_node.c,v 1.6 1998/01/15 19:00:04 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/parse_node.c,v 1.7 1998/01/17 04:53:19 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -47,16 +47,9 @@ make_parsestate(void) ...@@ -47,16 +47,9 @@ make_parsestate(void)
ParseState *pstate; ParseState *pstate;
pstate = palloc(sizeof(ParseState)); pstate = palloc(sizeof(ParseState));
MemSet(pstate, 0, sizeof(ParseState));
pstate->p_last_resno = 1; pstate->p_last_resno = 1;
pstate->p_rtable = NIL;
pstate->p_hasAggs = false;
pstate->p_is_insert = false;
pstate->p_insert_columns = NIL;
pstate->p_is_update = false;
pstate->p_is_rule = false;
pstate->p_in_where_clause = false;
pstate->p_target_relation = NULL;
pstate->p_target_rangetblentry = NULL;
return (pstate); return (pstate);
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.125 1998/01/09 19:34:38 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.126 1998/01/17 04:53:32 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -562,7 +562,7 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout) ...@@ -562,7 +562,7 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout)
char *rnotnull; char *rnotnull;
char *rhasdef; char *rhasdef;
int i; int i;
int rsize; int attlen, atttypmod;
PGresult *res, *res2; PGresult *res, *res2;
int usePipe = 0; int usePipe = 0;
char *pagerenv; char *pagerenv;
...@@ -598,7 +598,8 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout) ...@@ -598,7 +598,8 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout)
} }
descbuf[0] = '\0'; descbuf[0] = '\0';
strcat(descbuf, "SELECT a.attnum, a.attname, t.typname, a.attlen, a.attnotnull, a.atthasdef "); strcat(descbuf, "SELECT a.attnum, a.attname, t.typname, a.attlen, ");
strcat(descbuf, "a.atttypmod, a.attnotnull, a.atthasdef ");
strcat(descbuf, "FROM pg_class c, pg_attribute a, pg_type t "); strcat(descbuf, "FROM pg_class c, pg_attribute a, pg_type t ");
strcat(descbuf, "WHERE c.relname = '"); strcat(descbuf, "WHERE c.relname = '");
strcat(descbuf, table); strcat(descbuf, table);
...@@ -643,9 +644,10 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout) ...@@ -643,9 +644,10 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout)
fprintf(fout,"| %-32.32s | ", PQgetvalue(res, i, 1)); fprintf(fout,"| %-32.32s | ", PQgetvalue(res, i, 1));
rtype = PQgetvalue(res, i, 2); rtype = PQgetvalue(res, i, 2);
rsize = atoi(PQgetvalue(res, i, 3)); attlen = atoi(PQgetvalue(res, i, 3));
rnotnull = PQgetvalue(res, i, 4); atttypmod = atoi(PQgetvalue(res, i, 4));
rhasdef = PQgetvalue(res, i, 5); rnotnull = PQgetvalue(res, i, 5);
rhasdef = PQgetvalue(res, i, 6);
strcpy(type_str, rtype); strcpy(type_str, rtype);
if (strcmp(rtype, "bpchar") == 0) if (strcmp(rtype, "bpchar") == 0)
...@@ -687,11 +689,11 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout) ...@@ -687,11 +689,11 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout)
fprintf(fout,"%6s |", "var"); fprintf(fout,"%6s |", "var");
else if (strcmp(rtype, "bpchar") == 0 || else if (strcmp(rtype, "bpchar") == 0 ||
strcmp(rtype, "varchar") == 0) strcmp(rtype, "varchar") == 0)
fprintf(fout,"%6i |", rsize > 0 ? rsize - VARHDRSZ : 0); fprintf(fout,"%6i |", atttypmod > 0 ? atttypmod - VARHDRSZ : 0);
else else
{ {
if (rsize > 0) if (attlen > 0)
fprintf(fout,"%6i |", rsize); fprintf(fout,"%6i |", attlen);
else else
fprintf(fout,"%6s |", "var"); fprintf(fout,"%6s |", "var");
} }
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: nodes.h,v 1.22 1998/01/10 04:30:08 momjian Exp $ * $Id: nodes.h,v 1.23 1998/01/17 04:53:38 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -60,6 +60,7 @@ typedef enum NodeTag ...@@ -60,6 +60,7 @@ typedef enum NodeTag
T_Const, T_Const,
T_Param, T_Param,
T_Aggreg, T_Aggreg,
T_SubLink,
T_Func, T_Func,
T_Array, T_Array,
T_ArrayRef, T_ArrayRef,
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: parsenodes.h,v 1.45 1998/01/16 23:20:55 momjian Exp $ * $Id: parsenodes.h,v 1.46 1998/01/17 04:53:40 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -45,6 +45,7 @@ typedef struct Query ...@@ -45,6 +45,7 @@ typedef struct Query
bool isBinary; /* binary portal? */ bool isBinary; /* binary portal? */
bool unionall; /* union without unique sort */ bool unionall; /* union without unique sort */
bool hasAggs; /* has aggregates in target list */ bool hasAggs; /* has aggregates in target list */
bool hasSubLinks; /* has subquery SubLink */
char *uniqueFlag; /* NULL, '*', or Unique attribute name */ char *uniqueFlag; /* NULL, '*', or Unique attribute name */
List *sortClause; /* a list of SortClause's */ List *sortClause; /* a list of SortClause's */
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: primnodes.h,v 1.12 1998/01/04 04:31:37 momjian Exp $ * $Id: primnodes.h,v 1.13 1998/01/17 04:53:42 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -270,6 +270,33 @@ typedef struct Aggreg ...@@ -270,6 +270,33 @@ typedef struct Aggreg
bool usenulls; bool usenulls;
} Aggreg; } Aggreg;
/* ----------------
* SubLink
* subLinkType - EXISTS, ALL, ANY, EXPR
* useor - TRUE for <>
* lefthand - list of Var/Const nodes on the left
* oper - list of Oper nodes
* subselect - subselect as Query* or parsetree
* ----------------
*/
typedef enum SubLinkType
{
EXISTS_SUBLINK, ALL_SUBLINK, ANY_SUBLINK, EXPR_SUBLINK,
IN_SUBLINK, NOTIN_SUBLINK, OPER_SUBLINK
} SubLinkType;
typedef struct SubLink
{
struct Query;
NodeTag type;
SubLinkType subLinkType;
bool useor;
List *lefthand;
List *oper;
Node *subselect;
} SubLink;
/* ---------------- /* ----------------
* Array * Array
* arrayelemtype - base type of the array's elements (homogenous!) * arrayelemtype - base type of the array's elements (homogenous!)
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: parse_node.h,v 1.4 1998/01/15 19:00:16 momjian Exp $ * $Id: parse_node.h,v 1.5 1998/01/17 04:53:46 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -32,6 +32,7 @@ typedef struct ParseState ...@@ -32,6 +32,7 @@ typedef struct ParseState
List *p_rtable; List *p_rtable;
List *p_insert_columns; List *p_insert_columns;
bool p_hasAggs; bool p_hasAggs;
bool p_hasSubLinks;
bool p_is_insert; bool p_is_insert;
bool p_is_update; bool p_is_update;
bool p_is_rule; bool p_is_rule;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment