Creates the SubLink structure, and the Query->hasSubLink field,
with supporting code. Creates SubLink node in gram.y. psql.c patch for newatttypmod field.
This commit is contained in:
parent
c65ea0e040
commit
b37bc65f44
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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)
|
|||||||
_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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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()
|
|||||||
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()
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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;
|
|||||||
|
|
||||||
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 ')'
|
|||||||
$$->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
|
|||||||
*/
|
*/
|
||||||
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;
|
||||||
|
n->subLinkType = NOTIN_SUBLINK;
|
||||||
|
n->subselect = $7;
|
||||||
|
$$ = (Node *)n;
|
||||||
}
|
}
|
||||||
| '(' row_descriptor ')' '=' '(' row_descriptor ')'
|
/* We accept all Operators? */
|
||||||
|
| '(' row_descriptor ')' Op '(' SubSelect ')'
|
||||||
{
|
{
|
||||||
$$ = makeRowExpr("=", $2, $6);
|
SubLink *n = makeNode(SubLink);
|
||||||
}
|
n->lefthand = $2;
|
||||||
| '(' row_descriptor ')' '<' '(' row_descriptor ')'
|
n->subLinkType = OPER_SUBLINK;
|
||||||
{
|
n->oper = lcons($4, NIL);
|
||||||
$$ = makeRowExpr("<", $2, $6);
|
n->subselect = $6;
|
||||||
}
|
$$ = (Node *)n;
|
||||||
| '(' row_descriptor ')' '>' '(' row_descriptor ')'
|
|
||||||
{
|
|
||||||
$$ = makeRowExpr("<", $2, $6);
|
|
||||||
}
|
}
|
||||||
|
/* 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
|
|||||||
*/
|
*/
|
||||||
| 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
|
|||||||
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
|
|||||||
|
|
||||||
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
|
|||||||
|
|
||||||
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)
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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)
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
* 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
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
* 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
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
* 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
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
* 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
|
|||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user