Implement column aliases on views "CREATE VIEW name (collist)".

Implement TIME WITH TIME ZONE type (timetz internal type).
Remap length() for character strings to CHAR_LENGTH() for SQL92
 and to remove the ambiguity with geometric length() functions.
Keep length() for character strings for backward compatibility.
Shrink stored views by removing internal column name list from visible rte.
Implement min(), max() for time and timetz data types.
Implement conversion of TIME to INTERVAL.
Implement abs(), mod(), fac() for the int8 data type.
Rename some math functions to generic names:
 round(), sqrt(), cbrt(), pow(), etc.
Rename NUMERIC power() function to pow().
Fix int2 factorial to calculate result in int4.
Enhance the Oracle compatibility function translate() to work with string
 arguments (from Edwin Ramirez).
Modify pg_proc system table to remove OID holes.
This commit is contained in:
Thomas G. Lockhart 2000-03-14 23:06:59 +00:00
parent ce543b2121
commit 6456810078
58 changed files with 1495 additions and 1113 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.122 2000/02/18 09:28:40 inoue Exp $
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.123 2000/03/14 23:06:06 thomas Exp $
*
*
* INTERFACE ROUTINES
@ -1719,8 +1719,10 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin,
*/
rte = makeNode(RangeTblEntry);
rte->relname = RelationGetRelationName(rel);
#ifndef DISABLE_EREF
rte->ref = makeNode(Attr);
rte->ref->relname = RelationGetRelationName(rel);
#endif
rte->relid = RelationGetRelid(rel);
rte->inh = false;
rte->inFromCl = true;
@ -1799,8 +1801,10 @@ StoreRelCheck(Relation rel, char *ccname, char *ccbin)
*/
rte = makeNode(RangeTblEntry);
rte->relname = RelationGetRelationName(rel);
#ifndef DISABLE_EREF
rte->ref = makeNode(Attr);
rte->ref->relname = RelationGetRelationName(rel);
#endif
rte->relid = RelationGetRelid(rel);
rte->inh = false;
rte->inFromCl = true;

View File

@ -5,7 +5,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994-5, Regents of the University of California
*
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.54 2000/02/15 20:49:08 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.55 2000/03/14 23:06:12 thomas Exp $
*
*/
@ -232,9 +232,33 @@ explain_outNode(StringInfo str, Plan *plan, int indent, ExplainState *es)
appendStringInfo(str, " on %s",
stringStringInfo(rte->relname));
if (rte->ref && strcmp(rte->ref->relname, rte->relname) != 0)
appendStringInfo(str, " %s",
stringStringInfo(rte->ref->relname));
if (rte->ref != NULL)
{
if ((strcmp(rte->ref->relname, rte->relname) != 0)
|| (length(rte->ref->attrs) > 0))
{
appendStringInfo(str, " %s",
stringStringInfo(rte->ref->relname));
if (length(rte->ref->attrs) > 0)
{
List *c;
int firstEntry = true;
appendStringInfo(str, " (");
foreach (c, rte->ref->attrs)
{
if (! firstEntry)
{
appendStringInfo(str, ", ");
firstEntry = false;
}
appendStringInfo(str, "%s", strVal(lfirst(c)));
}
appendStringInfo(str, ")");
}
}
}
}
break;
default:

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.108 2000/02/21 18:47:00 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.109 2000/03/14 23:06:27 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -1366,6 +1366,7 @@ _copyRangeTblEntry(RangeTblEntry *from)
if (from->relname)
newnode->relname = pstrdup(from->relname);
Node_Copy(from, newnode, ref);
Node_Copy(from, newnode, eref);
newnode->relid = from->relid;
newnode->inh = from->inh;
newnode->inFromCl = from->inFromCl;

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.38 2000/02/21 18:47:00 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.39 2000/03/14 23:06:28 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -1031,6 +1031,7 @@ _freeRangeTblEntry(RangeTblEntry *node)
if (node->relname)
pfree(node->relname);
freeObject(node->ref);
freeObject(node->eref);
pfree(node);
}

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.45 2000/02/15 20:49:19 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.46 2000/03/14 23:06:29 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -454,8 +454,8 @@ new_rangetable_entry(Oid new_relid, RangeTblEntry *old_entry)
RangeTblEntry *new_entry = copyObject(old_entry);
/* ??? someone tell me what the following is doing! - ay 11/94 */
if (!strcmp(new_entry->ref->relname, "*CURRENT*") ||
!strcmp(new_entry->ref->relname, "*NEW*"))
if (!strcmp(new_entry->eref->relname, "*CURRENT*") ||
!strcmp(new_entry->eref->relname, "*NEW*"))
new_entry->ref->relname = get_rel_name(new_relid);
else
new_entry->relname = get_rel_name(new_relid);

View File

@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: analyze.c,v 1.139 2000/03/01 05:18:20 tgl Exp $
* $Id: analyze.c,v 1.140 2000/03/14 23:06:30 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -146,6 +146,34 @@ transformStmt(ParseState *pstate, Node *parseTree)
ViewStmt *n = (ViewStmt *) parseTree;
n->query = (Query *) transformStmt(pstate, (Node *) n->query);
/* If a list of column names was given, run through and insert these
* into the actual query tree. - thomas 2000-03-08
*/
if (n->aliases != NIL)
{
int i;
List *targetList = n->query->targetList;
if (length(targetList) < length(n->aliases))
elog(ERROR, "CREATE VIEW specifies %d columns"
" but only %d columns are present",
length(targetList), length(n->aliases));
for (i = 0; i < length(n->aliases); i++)
{
Ident *id;
TargetEntry *te;
Resdom *rd;
id = nth(i, n->aliases);
Assert(nodeTag(id) == T_Ident);
te = nth(i, targetList);
Assert(nodeTag(te) == T_TargetEntry);
rd = te->resdom;
Assert(nodeTag(rd) == T_Resdom);
rd->resname = pstrdup(id->name);
}
}
result = makeNode(Query);
result->commandType = CMD_UTILITY;
result->utilityStmt = (Node *) n;
@ -1904,7 +1932,7 @@ transformForUpdate(Query *qry, List *forUpdate)
i = 1;
foreach(l2, qry->rtable)
{
if (strcmp(((RangeTblEntry *) lfirst(l2))->ref->relname, relname) == 0)
if (strcmp(((RangeTblEntry *) lfirst(l2))->eref->relname, relname) == 0)
{
List *l3;
@ -1925,7 +1953,7 @@ transformForUpdate(Query *qry, List *forUpdate)
i++;
}
if (l2 == NULL)
elog(ERROR, "FOR UPDATE: relation %s not found in FROM clause",
elog(ERROR, "FOR UPDATE: relation '%s' not found in FROM clause",
relname);
}

View File

@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.155 2000/03/12 20:09:41 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.156 2000/03/14 23:06:31 thomas Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@ -307,7 +307,7 @@ static void doNegateFloat(Value *v);
ISOLATION, JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL,
MATCH, MINUTE_P, MONTH_P, NAMES,
NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC,
OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P,
OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P, OVERLAPS,
PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
SCROLL, SECOND_P, SELECT, SESSION_USER, SET, SUBSTRING,
@ -363,6 +363,7 @@ static void doNegateFloat(Value *v);
%right '='
%nonassoc '<' '>'
%nonassoc LIKE
%nonassoc OVERLAPS
%nonassoc BETWEEN
%nonassoc IN
%left Op /* multi-character ops and user-defined operators */
@ -1903,7 +1904,7 @@ comment_text: Sconst { $$ = $1; }
*
*****************************************************************************/
FetchStmt: FETCH direction fetch_how_many from_in name
FetchStmt: FETCH direction fetch_how_many from_in name
{
FetchStmt *n = makeNode(FetchStmt);
if ($2 == RELATIVE)
@ -1923,7 +1924,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name
n->ismove = false;
$$ = (Node *)n;
}
| FETCH fetch_how_many from_in name
| FETCH fetch_how_many from_in name
{
FetchStmt *n = makeNode(FetchStmt);
if ($2 < 0)
@ -1940,7 +1941,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name
n->ismove = false;
$$ = (Node *)n;
}
| FETCH direction from_in name
| FETCH direction from_in name
{
FetchStmt *n = makeNode(FetchStmt);
if ($2 == RELATIVE)
@ -1953,7 +1954,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name
n->ismove = false;
$$ = (Node *)n;
}
| FETCH from_in name
| FETCH from_in name
{
FetchStmt *n = makeNode(FetchStmt);
n->direction = FORWARD;
@ -1962,7 +1963,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name
n->ismove = false;
$$ = (Node *)n;
}
| FETCH name
| FETCH name
{
FetchStmt *n = makeNode(FetchStmt);
n->direction = FORWARD;
@ -1972,7 +1973,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name
$$ = (Node *)n;
}
| MOVE direction fetch_how_many from_in name
| MOVE direction fetch_how_many from_in name
{
FetchStmt *n = makeNode(FetchStmt);
if ($3 < 0)
@ -1986,7 +1987,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name
n->ismove = TRUE;
$$ = (Node *)n;
}
| MOVE fetch_how_many from_in name
| MOVE fetch_how_many from_in name
{
FetchStmt *n = makeNode(FetchStmt);
if ($2 < 0)
@ -2003,7 +2004,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name
n->ismove = TRUE;
$$ = (Node *)n;
}
| MOVE direction from_in name
| MOVE direction from_in name
{
FetchStmt *n = makeNode(FetchStmt);
n->direction = $2;
@ -2021,7 +2022,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name
n->ismove = TRUE;
$$ = (Node *)n;
}
| MOVE name
| MOVE name
{
FetchStmt *n = makeNode(FetchStmt);
n->direction = FORWARD;
@ -2659,11 +2660,12 @@ opt_trans: WORK { $$ = TRUE; }
*
*****************************************************************************/
ViewStmt: CREATE VIEW name AS SelectStmt
ViewStmt: CREATE VIEW name opt_column_list AS SelectStmt
{
ViewStmt *n = makeNode(ViewStmt);
n->viewname = $3;
n->query = (Query *)$5;
n->aliases = $4;
n->query = (Query *)$6;
if (((SelectStmt *)n->query)->sortClause != NULL)
elog(ERROR,"ORDER BY and DISTINCT on views are not implemented");
if (((SelectStmt *)n->query)->unionClause != NULL)
@ -2737,7 +2739,7 @@ createdb_opt_encoding:
int i;
i = pg_char_to_encoding($3);
if (i == -1)
elog(ERROR, "%s is not a valid encoding name.", $3);
elog(ERROR, "%s is not a valid encoding name", $3);
$$ = i;
#else
elog(ERROR, "Multi-byte support is not enabled");
@ -2747,7 +2749,7 @@ createdb_opt_encoding:
{
#ifdef MULTIBYTE
if (!pg_get_encent_by_encoding($3))
elog(ERROR, "%d is not a valid encoding code.", $3);
elog(ERROR, "%d is not a valid encoding code", $3);
$$ = $3;
#else
elog(ERROR, "Multi-byte support is not enabled");
@ -3979,10 +3981,13 @@ Datetime: datetime
$$->timezone = $2;
$$->typmod = -1;
}
| TIME
| TIME opt_timezone
{
$$ = makeNode(TypeName);
$$->name = xlateSqlType("time");
if ($2)
$$->name = xlateSqlType("timetz");
else
$$->name = xlateSqlType("time");
$$->typmod = -1;
}
| INTERVAL opt_interval
@ -4077,6 +4082,27 @@ row_expr: '(' row_descriptor ')' IN '(' SubSelect ')'
{
$$ = makeRowExpr($4, $2, $6);
}
| '(' row_descriptor ')' OVERLAPS '(' row_descriptor ')'
{
FuncCall *n = makeNode(FuncCall);
List *largs = $2;
List *rargs = $6;
n->funcname = xlateSqlFunc("overlaps");
if (length(largs) == 1)
largs = lappend(largs, $2);
else if (length(largs) != 2)
elog(ERROR, "Wrong number of parameters"
" on left side of OVERLAPS expression");
if (length(rargs) == 1)
rargs = lappend(rargs, $6);
else if (length(rargs) != 2)
elog(ERROR, "Wrong number of parameters"
" on right side of OVERLAPS expression");
n->args = nconc(largs, rargs);
n->agg_star = false;
n->agg_distinct = false;
$$ = (Node *)n;
}
;
row_descriptor: row_list ',' a_expr
@ -4579,7 +4605,8 @@ c_expr: attr
n->agg_distinct = false;
if ($3 != 0)
elog(NOTICE,"CURRENT_TIME(%d) precision not implemented; zero used instead",$3);
elog(NOTICE,"CURRENT_TIME(%d) precision not implemented"
"; zero used instead",$3);
$$ = (Node *)n;
}
@ -4632,7 +4659,8 @@ c_expr: attr
n->agg_distinct = false;
if ($3 != 0)
elog(NOTICE,"CURRENT_TIMESTAMP(%d) precision not implemented; zero used instead",$3);
elog(NOTICE,"CURRENT_TIMESTAMP(%d) precision not implemented"
"; zero used instead",$3);
$$ = (Node *)n;
}
@ -5219,6 +5247,7 @@ ColId: IDENT { $$ = $1; }
| ONLY { $$ = "only"; }
| OPERATOR { $$ = "operator"; }
| OPTION { $$ = "option"; }
| OVERLAPS { $$ = "overlaps"; }
| PASSWORD { $$ = "password"; }
| PENDANT { $$ = "pendant"; }
| PRIOR { $$ = "prior"; }
@ -5454,9 +5483,8 @@ mapTargetColumns(List *src, List *dst)
static char *
xlateSqlFunc(char *name)
{
if (!strcasecmp(name,"character_length")
|| !strcasecmp(name,"char_length"))
return "length";
if (!strcasecmp(name,"character_length"))
return "char_length";
else
return name;
} /* xlateSqlFunc() */

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.67 2000/02/18 09:29:40 inoue Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.68 2000/03/14 23:06:32 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -184,6 +184,7 @@ static ScanKeyword ScanKeywords[] = {
{"or", OR},
{"order", ORDER},
{"outer", OUTER_P},
{"overlaps", OVERLAPS},
{"partial", PARTIAL},
{"password", PASSWORD},
{"pendant", PENDANT},

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.34 2000/02/15 03:37:47 thomas Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.35 2000/03/14 23:06:32 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -111,7 +111,7 @@ check_ungrouped_columns_walker(Node *node,
elog(ERROR, "cache lookup of attribute %d in relation %u failed",
var->varattno, rte->relid);
elog(ERROR, "Attribute %s.%s must be GROUPed or used in an aggregate function",
rte->ref->relname, attname);
rte->eref->relname, attname);
}
/* Otherwise, recurse. */
return expression_tree_walker(node, check_ungrouped_columns_walker,

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.55 2000/02/19 23:45:05 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.56 2000/03/14 23:06:32 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -478,7 +478,7 @@ parseFromClause(ParseState *pstate, List *frmList)
{
Assert(IsA(j->larg, RangeVar));
l_rte = transformTableEntry(pstate, (RangeVar *) j->larg);
l_name = expandTable(pstate, l_rte->ref->relname, TRUE);
l_name = expandTable(pstate, l_rte->eref->relname, TRUE);
}
if (IsA(j->rarg, JoinExpr))
@ -490,7 +490,7 @@ parseFromClause(ParseState *pstate, List *frmList)
{
Assert(IsA(j->rarg, RangeVar));
r_rte = transformTableEntry(pstate, (RangeVar *) j->rarg);
r_name = expandTable(pstate, r_rte->ref->relname, TRUE);
r_name = expandTable(pstate, r_rte->eref->relname, TRUE);
}
/* Natural join does not explicitly specify columns; must generate columns to join.

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.34 2000/03/11 23:19:50 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.35 2000/03/14 23:06:32 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -319,6 +319,7 @@ TypeCategory(Oid inType)
case (DATEOID):
case (TIMEOID):
case (TIMETZOID):
case (ABSTIMEOID):
case (TIMESTAMPOID):
result = DATETIME_TYPE;

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.72 2000/03/07 23:30:53 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.73 2000/03/14 23:06:32 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -574,15 +574,7 @@ transformIdent(ParseState *pstate, Ident *ident, int precedence)
if ((rte = colnameRangeTableEntry(pstate, ident->name)) != NULL)
{
/* Convert it to a fully qualified Attr, and transform that */
#ifndef DISABLE_JOIN_SYNTAX
Attr *att = makeAttr(rte->ref->relname, ident->name);
#else
Attr *att = makeNode(Attr);
att->relname = rte->refname;
att->paramNo = NULL;
att->attrs = lcons(makeString(ident->name), NIL);
#endif
Attr *att = makeAttr(rte->eref->relname, ident->name);
att->indirection = ident->indirection;
return transformAttr(pstate, att, precedence);
}

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.73 2000/03/11 23:17:47 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.74 2000/03/14 23:06:32 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -325,7 +325,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
* now allow column aliases.
* - thomas 2000-02-07
*/
if (rte->ref->attrs != NULL)
if (rte->eref->attrs != NULL)
{
List *c;
/* start counting attributes/columns from one.
@ -333,7 +333,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
* - thomas 2000-01-27
*/
int i = 1;
foreach (c, rte->ref->attrs)
foreach (c, rte->eref->attrs)
{
char *colname = strVal(lfirst(c));
/* found a match? */
@ -550,7 +550,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
relname = rte->relname;
vnum = refnameRangeTablePosn(pstate, rte->ref->relname, NULL);
vnum = refnameRangeTablePosn(pstate, rte->eref->relname, NULL);
/*
* for func(relname), the param to the function is the tuple

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.36 2000/03/09 05:00:24 inoue Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.37 2000/03/14 23:06:33 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -68,8 +68,12 @@ static char *attnum_type[SPECIALS] = {
/* refnameRangeTableEntries()
* Given refname, return a list of range table entries
* This is possible with JOIN syntax, where tables in a join
* acquire the same reference name
* acquire the same reference name.
* - thomas 2000-01-20
* But at the moment we aren't carrying along a full list of
* table/column aliases, so we don't have the full mechanism
* to support outer joins in place yet.
* - thomas 2000-03-04
*/
List *
refnameRangeTableEntries(ParseState *pstate, char *refname);
@ -86,7 +90,7 @@ refnameRangeTableEntries(ParseState *pstate, char *refname)
{
RangeTblEntry *rte = lfirst(temp);
if (strcmp(rte->ref->relname, refname) == 0)
if (strcmp(rte->eref->relname, refname) == 0)
rteList = lappend(rteList, rte);
}
/* only allow correlated columns in WHERE clause */
@ -110,11 +114,7 @@ refnameRangeTableEntry(ParseState *pstate, char *refname)
{
RangeTblEntry *rte = lfirst(temp);
#ifndef DISABLE_JOIN_SYNTAX
if (strcmp(rte->ref->relname, refname) == 0)
#else
if (!strcmp(rte->refname, refname))
#endif
if (strcmp(rte->eref->relname, refname) == 0)
return rte;
}
/* only allow correlated columns in WHERE clause */
@ -143,11 +143,7 @@ refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
{
RangeTblEntry *rte = lfirst(temp);
#ifndef DISABLE_JOIN_SYNTAX
if (strcmp(rte->ref->relname, refname) == 0)
#else
if (!strcmp(rte->refname, refname))
#endif
if (strcmp(rte->eref->relname, refname) == 0)
return index;
index++;
}
@ -191,7 +187,7 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
if (!rte->inFromCl && rte != pstate->p_target_rangetblentry)
continue;
if (rte->ref->attrs != NULL)
if (rte->eref->attrs != NULL)
{
List *c;
foreach (c, rte->ref->attrs)
@ -253,6 +249,7 @@ addRangeTableEntry(ParseState *pstate,
{
Relation rel;
RangeTblEntry *rte;
Attr *eref;
int maxattrs;
int sublevels_up;
int varattno;
@ -286,19 +283,22 @@ addRangeTableEntry(ParseState *pstate,
rel = heap_openr(relname, AccessShareLock);
rte->relid = RelationGetRelid(rel);
maxattrs = RelationGetNumberOfAttributes(rel);
if (maxattrs < length(ref->attrs))
eref = copyObject(ref);
if (maxattrs < length(eref->attrs))
elog(ERROR, "Table '%s' has %d columns available but %d columns specified",
relname, maxattrs, length(ref->attrs));
relname, maxattrs, length(eref->attrs));
/* fill in any unspecified alias columns */
for (varattno = length(ref->attrs); varattno < maxattrs; varattno++)
for (varattno = length(eref->attrs); varattno < maxattrs; varattno++)
{
char *attrname;
attrname = pstrdup(NameStr(rel->rd_att->attrs[varattno]->attname));
ref->attrs = lappend(ref->attrs, makeString(attrname));
eref->attrs = lappend(eref->attrs, makeString(attrname));
}
heap_close(rel, AccessShareLock);
rte->eref = eref;
/*
* Flags:
@ -337,10 +337,9 @@ expandTable(ParseState *pstate, char *refname, bool getaliases)
rte = refnameRangeTableEntry(pstate, refname);
if (getaliases && (rte != NULL) && (rte->ref != NULL)
&& (length(rte->ref->attrs) > 0))
if (getaliases && (rte != NULL))
{
return rte->ref;
return rte->eref;
}
if (rte != NULL)
@ -415,8 +414,8 @@ expandAll(ParseState *pstate, char *relname, Attr *ref, int *this_resno)
attrname = pstrdup(NameStr(rel->rd_att->attrs[varattno]->attname));
/* varattno is zero-based, so check that length() is always greater */
if (length(rte->ref->attrs) > varattno)
label = pstrdup(strVal(nth(varattno, rte->ref->attrs)));
if (length(rte->eref->attrs) > varattno)
label = pstrdup(strVal(nth(varattno, rte->eref->attrs)));
else
label = attrname;
varnode = make_var(pstate, rte->relid, relname, attrname);

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.56 2000/03/09 05:00:24 inoue Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.57 2000/03/14 23:06:33 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -430,7 +430,7 @@ ExpandAllTables(ParseState *pstate)
continue;
target = nconc(target,
expandAll(pstate, rte->ref->relname, rte->ref,
expandAll(pstate, rte->eref->relname, rte->eref,
&pstate->p_last_resno));
}
return target;

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.42 2000/02/16 18:17:02 thomas Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.43 2000/03/14 23:06:35 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -198,7 +198,7 @@ date_timestamp(DateADT dateVal)
double fsec = 0;
char *tzn;
result = palloc(sizeof(Timestamp));
result = palloc(sizeof(*result));
if (date2tm(dateVal, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to convert date to timestamp");
@ -392,10 +392,10 @@ time_in(char *str)
elog(ERROR, "Bad (null) time external representation");
if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0)
|| (DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec) != 0))
|| (DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, NULL) != 0))
elog(ERROR, "Bad time external representation '%s'", str);
time = palloc(sizeof(TimeADT));
time = palloc(sizeof(*time));
*time = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec);
@ -422,7 +422,7 @@ time_out(TimeADT *time)
fsec = 0;
EncodeTimeOnly(tm, fsec, DateStyle, buf);
EncodeTimeOnly(tm, fsec, NULL, DateStyle, buf);
result = palloc(strlen(buf) + 1);
@ -456,8 +456,8 @@ time_lt(TimeADT *time1, TimeADT *time2)
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return *time1 < *time2;
} /* time_eq() */
return (*time1 < *time2);
} /* time_lt() */
bool
time_le(TimeADT *time1, TimeADT *time2)
@ -465,8 +465,8 @@ time_le(TimeADT *time1, TimeADT *time2)
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return *time1 <= *time2;
} /* time_eq() */
return (*time1 <= *time2);
} /* time_le() */
bool
time_gt(TimeADT *time1, TimeADT *time2)
@ -474,8 +474,8 @@ time_gt(TimeADT *time1, TimeADT *time2)
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return *time1 > *time2;
} /* time_eq() */
return (*time1 > *time2);
} /* time_gt() */
bool
time_ge(TimeADT *time1, TimeADT *time2)
@ -483,8 +483,8 @@ time_ge(TimeADT *time1, TimeADT *time2)
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return *time1 >= *time2;
} /* time_eq() */
return (*time1 >= *time2);
} /* time_ge() */
int
time_cmp(TimeADT *time1, TimeADT *time2)
@ -492,6 +492,43 @@ time_cmp(TimeADT *time1, TimeADT *time2)
return (*time1 < *time2) ? -1 : (((*time1 > *time2) ? 1 : 0));
} /* time_cmp() */
TimeADT *
time_larger(TimeADT *time1, TimeADT *time2)
{
return time_gt(time1, time2)? time1: time2;
} /* time_larger() */
TimeADT *
time_smaller(TimeADT *time1, TimeADT *time2)
{
return time_lt(time1, time2)? time1: time2;
} /* time_smaller() */
/* overlaps_time()
* Implements the SQL92 OVERLAPS operator.
* Algorithm from Date and Darwen, 1997
*/
bool
overlaps_time(TimeADT *ts1, TimeADT *te1, TimeADT *ts2, TimeADT *te2)
{
/* Make sure we have ordered pairs... */
if (time_gt(ts1, te1))
{
TimeADT *tt = ts1;
ts1 = te1;
te1 = tt;
}
if (time_gt(ts2, te2))
{
TimeADT *tt = ts2;
ts2 = te2;
te2 = tt;
}
return ((time_gt(ts1, ts2) && (time_lt(ts1, te2) || time_lt(te1, te2)))
|| (time_gt(ts2, ts1) && (time_lt(ts2, te1) || time_lt(te2, te1)))
|| time_eq(ts1, ts2));
}
/* timestamp_time()
* Convert timestamp to time data type.
@ -515,12 +552,10 @@ timestamp_time(Timestamp *timestamp)
if (TIMESTAMP_IS_EPOCH(*timestamp))
{
timestamp2tm(SetTimestamp(*timestamp), NULL, tm, &fsec, NULL);
}
else if (TIMESTAMP_IS_CURRENT(*timestamp))
{
timestamp2tm(SetTimestamp(*timestamp), &tz, tm, &fsec, &tzn);
}
else
{
@ -528,7 +563,7 @@ timestamp_time(Timestamp *timestamp)
elog(ERROR, "Unable to convert timestamp to date");
}
result = palloc(sizeof(TimeADT));
result = palloc(sizeof(*result));
*result = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec);
@ -546,7 +581,7 @@ datetime_timestamp(DateADT date, TimeADT *time)
if (!PointerIsValid(time))
{
result = palloc(sizeof(Timestamp));
result = palloc(sizeof(*result));
TIMESTAMP_INVALID(*result);
}
else
@ -557,3 +592,270 @@ datetime_timestamp(DateADT date, TimeADT *time)
return result;
} /* datetime_timestamp() */
/* time_interval()
* Convert time to interval data type.
*/
Interval *
time_interval(TimeADT *time)
{
Interval *result;
if (!PointerIsValid(time))
return NULL;
result = palloc(sizeof(*result));
result->time = *time;
result->month = 0;
return result;
} /* time_interval() */
/*****************************************************************************
* Time With Time Zone ADT
*****************************************************************************/
TimeTzADT *
timetz_in(char *str)
{
TimeTzADT *time;
double fsec;
struct tm tt,
*tm = &tt;
int tz;
int nf;
char lowstr[MAXDATELEN + 1];
char *field[MAXDATEFIELDS];
int dtype;
int ftype[MAXDATEFIELDS];
if (!PointerIsValid(str))
elog(ERROR, "Bad (null) time external representation");
if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0)
|| (DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, &tz) != 0))
elog(ERROR, "Bad time external representation '%s'", str);
time = palloc(sizeof(*time));
time->time = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec);
time->zone = tz;
return time;
} /* timetz_in() */
char *
timetz_out(TimeTzADT *time)
{
char *result;
struct tm tt,
*tm = &tt;
double fsec;
int tz;
char buf[MAXDATELEN + 1];
if (!PointerIsValid(time))
return NULL;
tm->tm_hour = (time->time / (60 * 60));
tm->tm_min = (((int) (time->time / 60)) % 60);
tm->tm_sec = (((int) time->time) % 60);
fsec = 0;
tz = time->zone;
EncodeTimeOnly(tm, fsec, &tz, DateStyle, buf);
result = palloc(strlen(buf) + 1);
strcpy(result, buf);
return result;
} /* timetz_out() */
bool
timetz_eq(TimeTzADT *time1, TimeTzADT *time2)
{
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return ((time1->time + time1->zone) == (time2->time + time2->zone));
} /* timetz_eq() */
bool
timetz_ne(TimeTzADT *time1, TimeTzADT *time2)
{
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return ((time1->time + time1->zone) != (time2->time + time2->zone));
} /* timetz_ne() */
bool
timetz_lt(TimeTzADT *time1, TimeTzADT *time2)
{
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return ((time1->time + time1->zone) < (time2->time + time2->zone));
} /* timetz_lt() */
bool
timetz_le(TimeTzADT *time1, TimeTzADT *time2)
{
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return ((time1->time + time1->zone) <= (time2->time + time2->zone));
} /* timetz_le() */
bool
timetz_gt(TimeTzADT *time1, TimeTzADT *time2)
{
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return ((time1->time + time1->zone) > (time2->time + time2->zone));
} /* timetz_gt() */
bool
timetz_ge(TimeTzADT *time1, TimeTzADT *time2)
{
if (!PointerIsValid(time1) || !PointerIsValid(time2))
return FALSE;
return ((time1->time + time1->zone) >= (time2->time + time2->zone));
} /* timetz_ge() */
int
timetz_cmp(TimeTzADT *time1, TimeTzADT *time2)
{
return (timetz_lt(time1, time2) ? -1 : (timetz_gt(time1, time2)? 1: 0));
} /* timetz_cmp() */
TimeTzADT *
timetz_larger(TimeTzADT *time1, TimeTzADT *time2)
{
return timetz_gt(time1, time2)? time1: time2;
} /* timetz_larger() */
TimeTzADT *
timetz_smaller(TimeTzADT *time1, TimeTzADT *time2)
{
return timetz_lt(time1, time2)? time1: time2;
} /* timetz_smaller() */
/* overlaps_timetz()
* Implements the SQL92 OVERLAPS operator.
* Algorithm from Date and Darwen, 1997
*/
bool
overlaps_timetz(TimeTzADT *ts1, TimeTzADT *te1, TimeTzADT *ts2, TimeTzADT *te2)
{
/* Make sure we have ordered pairs... */
if (timetz_gt(ts1, te1))
{
TimeTzADT *tt = ts1;
ts1 = te1;
te1 = tt;
}
if (timetz_gt(ts2, te2))
{
TimeTzADT *tt = ts2;
ts2 = te2;
te2 = tt;
}
return ((timetz_gt(ts1, ts2) && (timetz_lt(ts1, te2) || timetz_lt(te1, te2)))
|| (timetz_gt(ts2, ts1) && (timetz_lt(ts2, te1) || timetz_lt(te2, te1)))
|| timetz_eq(ts1, ts2));
} /* overlaps_timetz() */
/* timestamp_timetz()
* Convert timestamp to timetz data type.
*/
TimeTzADT *
timestamp_timetz(Timestamp *timestamp)
{
TimeTzADT *result;
struct tm tt,
*tm = &tt;
int tz;
double fsec;
char *tzn;
if (!PointerIsValid(timestamp))
elog(ERROR, "Unable to convert null timestamp to date");
if (TIMESTAMP_NOT_FINITE(*timestamp))
elog(ERROR, "Unable to convert timestamp to date");
if (TIMESTAMP_IS_EPOCH(*timestamp))
{
timestamp2tm(SetTimestamp(*timestamp), NULL, tm, &fsec, NULL);
tz = 0;
}
else if (TIMESTAMP_IS_CURRENT(*timestamp))
{
timestamp2tm(SetTimestamp(*timestamp), &tz, tm, &fsec, &tzn);
}
else
{
if (timestamp2tm(*timestamp, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to convert timestamp to date");
}
result = palloc(sizeof(*result));
result->time = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec);
result->zone = tz;
return result;
} /* timestamp_timetz() */
/* datetimetz_timestamp()
* Convert date and timetz to timestamp data type.
* Timestamp is stored in GMT, so add the time zone
* stored with the timetz to the result.
* - thomas 2000-03-10
*/
Timestamp *
datetimetz_timestamp(DateADT date, TimeTzADT *time)
{
Timestamp *result;
struct tm tt,
*tm = &tt;
int tz;
double fsec = 0;
char *tzn;
result = palloc(sizeof(*result));
if (!PointerIsValid(date) || !PointerIsValid(time))
{
TIMESTAMP_INVALID(*result);
}
else
{
if (date2tm(date, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to convert date to timestamp");
if (tm2timestamp(tm, fsec, &time->zone, result) != 0)
elog(ERROR, "Timestamp out of range");
*result += time->time;
}
return result;
} /* datetimetz_timestamp() */

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.42 2000/02/16 18:17:02 thomas Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.43 2000/03/14 23:06:36 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -618,8 +618,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
tm->tm_min = 0;
tm->tm_sec = 0;
*fsec = 0;
tm->tm_isdst = -1; /* don't know daylight savings time status
* apriori */
tm->tm_isdst = -1; /* don't know daylight savings time status apriori */
if (tzp != NULL)
*tzp = 0;
@ -897,8 +896,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
tm->tm_mon += 1;
#if defined(HAVE_TM_ZONE)
*tzp = -(tm->tm_gmtoff); /* tm_gmtoff is
* Sun/DEC-ism */
*tzp = -(tm->tm_gmtoff); /* tm_gmtoff is Sun/DEC-ism */
#elif defined(HAVE_INT_TIMEZONE)
#ifdef __CYGWIN__
*tzp = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
@ -927,9 +925,18 @@ DecodeDateTime(char **field, int *ftype, int nf,
/* DecodeTimeOnly()
* Interpret parsed string as time fields only.
* Note that support for time zone is here for
* SQL92 TIME WITH TIME ZONE, but it reveals
* bogosity with SQL92 date/time standards, since
* we must infer a time zone from current time.
* XXX Later, we should probably support
* SET TIME ZONE <integer>
* which of course is a screwed up convention.
* - thomas 2000-03-10
*/
int
DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct tm * tm, double *fsec)
DecodeTimeOnly(char **field, int *ftype, int nf,
int *dtype, struct tm * tm, double *fsec, int *tzp)
{
int fmask,
tmask,
@ -944,9 +951,10 @@ DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct tm * tm, dou
tm->tm_hour = 0;
tm->tm_min = 0;
tm->tm_sec = 0;
tm->tm_isdst = -1; /* don't know daylight savings time status
* apriori */
*fsec = 0;
tm->tm_isdst = -1; /* don't know daylight savings time status apriori */
if (tzp != NULL)
*tzp = 0;
fmask = DTK_DATE_M;
@ -959,6 +967,14 @@ DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct tm * tm, dou
return -1;
break;
case DTK_TZ:
if (tzp == NULL)
return -1;
if (DecodeTimezone(field[i], tzp) != 0)
return -1;
tmask = DTK_M(TZ);
break;
case DTK_NUMBER:
flen = strlen(field[i]);
@ -1035,6 +1051,45 @@ DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct tm * tm, dou
if ((fmask & DTK_TIME_M) != DTK_TIME_M)
return -1;
/* timezone not specified? then find local timezone if possible */
if ((tzp != NULL) && (!(fmask & DTK_M(TZ))))
{
struct tm tt, *tmp = &tt;
/*
* daylight savings time modifier but no standard timezone?
* then error
*/
if (fmask & DTK_M(DTZMOD))
return -1;
GetCurrentTime(tmp);
tmp->tm_hour = tm->tm_hour;
tmp->tm_min = tm->tm_min;
tmp->tm_sec = tm->tm_sec;
#ifdef USE_POSIX_TIME
tmp->tm_isdst = -1;
mktime(tmp);
tm->tm_isdst = tmp->tm_isdst;
#if defined(HAVE_TM_ZONE)
*tzp = -(tmp->tm_gmtoff); /* tm_gmtoff is Sun/DEC-ism */
#elif defined(HAVE_INT_TIMEZONE)
#ifdef __CYGWIN__
*tzp = ((tmp->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
#else
*tzp = ((tmp->tm_isdst > 0) ? (timezone - 3600) : timezone);
#endif
#else
#error USE_POSIX_TIME is defined but neither HAVE_TM_ZONE or HAVE_INT_TIMEZONE are defined
#endif
#else /* !USE_POSIX_TIME */
*tzp = CTimeZone;
#endif
}
return 0;
} /* DecodeTimeOnly() */
@ -1830,7 +1885,7 @@ EncodeDateOnly(struct tm * tm, int style, char *str)
* Encode time fields only.
*/
int
EncodeTimeOnly(struct tm * tm, double fsec, int style, char *str)
EncodeTimeOnly(struct tm * tm, double fsec, int *tzp, int style, char *str)
{
double sec;
@ -1842,6 +1897,15 @@ EncodeTimeOnly(struct tm * tm, double fsec, int style, char *str)
sprintf(str, "%02d:%02d:", tm->tm_hour, tm->tm_min);
sprintf((str + 6), ((fsec != 0) ? "%05.2f" : "%02.0f"), sec);
if (tzp != NULL)
{
int hour, min;
hour = -(*tzp / 3600);
min = ((abs(*tzp) / 60) % 60);
sprintf((str + strlen(str)), ((min != 0) ? "%+03d:%02d" : "%+03d"), hour, min);
}
return TRUE;
} /* EncodeTimeOnly() */

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.53 2000/01/26 05:57:14 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.54 2000/03/14 23:06:36 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -1236,6 +1236,31 @@ dlog1(float64 arg1)
return result;
}
/*
* dlog10 - returns a pointer to the base 10 logarithm of arg1
*/
float64
dlog10(float64 arg1)
{
float64 result;
double tmp;
if (!PointerIsValid(arg1))
return (float64) NULL;
result = (float64) palloc(sizeof(float64data));
tmp = *arg1;
if (tmp == 0.0)
elog(ERROR, "can't take log of zero");
if (tmp < 0)
elog(ERROR, "can't take log of a negative number");
*result = (float64data) log10(tmp);
CheckFloat8Val(*result);
return result;
} /* dlog10() */
/*
* ====================

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.48 2000/01/26 05:57:14 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.49 2000/03/14 23:06:36 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -3510,29 +3510,6 @@ path_div_pt(PATH *path, Point *point)
} /* path_div_pt() */
bool
path_contain_pt(PATH *path, Point *p)
{
if (!PointerIsValid(path) || !PointerIsValid(p))
return FALSE;
return (on_ppath(p, path));
} /* path_contain_pt() */
/* pt_contained_path
* Point in or on path? This is the same as on_ppath.
* - thomas 1998-10-29
*/
bool
pt_contained_path(Point *p, PATH *path)
{
if (!PointerIsValid(p) || !PointerIsValid(path))
return FALSE;
return path_contain_pt(path, p);
} /* pt_contained_path() */
Point *
path_center(PATH *path)
{

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.34 2000/03/07 23:58:38 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.35 2000/03/14 23:06:36 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -659,8 +659,8 @@ int42mod(int32 arg1, int32 arg2)
return arg1 % arg2;
}
/*
* int[24]fac - returns arg1!
/* int[24]fac()
* Factorial
*/
int32
int4fac(int32 arg1)
@ -678,7 +678,7 @@ int4fac(int32 arg1)
int32
int2fac(int16 arg1)
{
int16 result;
int32 result;
if (arg1 < 1)
result = 0;
@ -688,6 +688,21 @@ int2fac(int16 arg1)
return result;
}
/* int[24]abs()
* Absolute value
*/
int32
int4abs(int32 arg1)
{
return ((arg1 < 0)? -arg1: arg1);
}
int16
int2abs(int16 arg1)
{
return ((arg1 < 0)? -arg1: arg1);
}
int16
int2larger(int16 arg1, int16 arg2)
{

View File

@ -359,6 +359,63 @@ int8div(int64 *val1, int64 *val2)
return result;
} /* int8div() */
/* int8abs()
* Absolute value
*/
int64 *
int8abs(int64 *arg1)
{
int64 *result;
if (!PointerIsValid(arg1))
return NULL;
result = palloc(sizeof(*result));
*result = ((*arg1 < 0)? -*arg1: *arg1);
return result;
}
/* int8mod()
* Modulo operation.
*/
int64 *
int8mod(int64 *val1, int64 *val2)
{
int64 *result;
/* use the divide operation to check params and allocate storage */
result = int8div(val1, val2);
*result *= *val2;
*result = *val1 - *result;
return result;
} /* int8mod() */
/* int8fac()
* Factorial
*/
int64 *
int8fac(int64 *arg1)
{
int64 *result;
int64 i;
if (!PointerIsValid(arg1))
return NULL;
result = palloc(sizeof(*result));
if (*arg1 < 1)
*result = 0;
else
for (i = *arg1, *result = 1; i > 0; --i)
*result *= i;
return result;
}
int64 *
int8larger(int64 *val1, int64 *val2)
{
@ -634,4 +691,4 @@ int8_text(int64 *val)
memmove(VARDATA(result), s, len);
return result;
} /* int8out() */
} /* int8_text() */

View File

@ -1,24 +1,14 @@
/*
* Edmund Mergl <E.Mergl@bawue.de>
*
* $Id: oracle_compat.c,v 1.20 1999/07/15 15:20:19 momjian Exp $
* $Id: oracle_compat.c,v 1.21 2000/03/14 23:06:37 thomas Exp $
*
*/
#include <ctype.h>
#include "postgres.h"
text *lower(text *string);
text *upper(text *string);
text *initcap(text *string);
text *lpad(text *string1, int4 len, text *string2);
text *rpad(text *string1, int4 len, text *string2);
text *btrim(text *string, text *set);
text *ltrim(text *string, text *set);
text *rtrim(text *string, text *set);
text *substr(text *string, int4 m, int4 n);
text *translate(text *string, char from, char to);
#include "utils/builtins.h"
/********************************************************************
@ -506,42 +496,68 @@ substr(text *string, int4 m, int4 n)
*
* Syntax:
*
* text *translate(text *string, char from, char to)
* text *translate(text *string, text *from, text *to)
*
* Purpose:
*
* Returns string after replacing all occurences of from with
* the corresponding character in to. TRANSLATE will not remove
* characters.
* Modified to work with strings rather than single character
* for the substitution arguments.
* Modifications from Edwin Ramirez <ramirez@doc.mssm.edu>.
*
********************************************************************/
text *
translate(text *string, char from, char to)
translate(text *string, text *from, text *to)
{
text *ret;
char *ptr,
*ptr_ret;
int m;
text *ret;
char *ptr_ret, *from_ptr, *to_ptr;
char *source, *target, *temp, rep;
int m, fromlen, tolen, retlen, i;
if ((string == (text *) NULL) ||
((m = VARSIZE(string) - VARHDRSZ) <= 0))
return string;
ret = (text *) palloc(VARSIZE(string));
VARSIZE(ret) = VARSIZE(string);
ptr = VARDATA(string);
ptr_ret = VARDATA(ret);
target = (char *) palloc(VARSIZE(string) - VARHDRSZ);
source = VARDATA(string);
temp = target;
fromlen = VARSIZE(from) - VARHDRSZ;
from_ptr = VARDATA(from);
tolen = VARSIZE(to) - VARHDRSZ;
to_ptr = VARDATA(to);
retlen = 0;
while (m--)
{
*ptr_ret++ = *ptr == from ? to : *ptr;
ptr++;
rep = *source;
for(i=0;i<fromlen;i++) {
if(from_ptr[i] == *source) {
if(i < tolen) {
rep = to_ptr[i];
} else {
rep = 0;
}
break;
}
}
if(rep != 0) {
*target++ = rep;
retlen++;
}
source++;
}
ret = (text *) palloc(retlen + VARHDRSZ);
VARSIZE(ret) = retlen + VARHDRSZ;
ptr_ret = VARDATA(ret);
for(i=0;i<retlen;i++) {
*ptr_ret++ = temp[i];
}
pfree(target);
return ret;
}
/* EOF */

View File

@ -3,7 +3,7 @@
* out of its tuple
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.44 2000/02/26 21:13:18 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.45 2000/03/14 23:06:37 thomas Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@ -923,6 +923,8 @@ get_select_query_def(Query *query, deparse_context *context)
continue;
rte = (RangeTblEntry *) lfirst(l);
if (rte->ref == NULL)
continue;
if (!strcmp(rte->ref->relname, "*NEW*"))
continue;
if (!strcmp(rte->ref->relname, "*CURRENT*"))
@ -982,9 +984,10 @@ get_select_query_def(Query *query, deparse_context *context)
{
rte = (RangeTblEntry *) lfirst(l);
if (rte->ref == NULL)
continue;
if (!strcmp(rte->ref->relname, "*NEW*"))
continue;
if (!strcmp(rte->ref->relname, "*CURRENT*"))
continue;
@ -1008,7 +1011,9 @@ get_select_query_def(Query *query, deparse_context *context)
* Since we don't really support SQL joins yet, dropping
* the list of column aliases doesn't hurt anything...
*/
if (strcmp(rte->relname, rte->ref->relname) != 0)
if ((rte->ref != NULL)
&& ((strcmp(rte->relname, rte->ref->relname) != 0)
|| (rte->ref->attrs != NIL)))
{
appendStringInfo(buf, " %s",
quote_identifier(rte->ref->relname));
@ -1104,6 +1109,8 @@ get_insert_query_def(Query *query, deparse_context *context)
continue;
rte = (RangeTblEntry *) lfirst(l);
if (rte->ref == NULL)
continue;
if (!strcmp(rte->ref->relname, "*NEW*"))
continue;
if (!strcmp(rte->ref->relname, "*CURRENT*"))
@ -1274,7 +1281,10 @@ get_rule_expr(Node *node, deparse_context *context)
if (context->varprefix)
{
if (!strcmp(rte->ref->relname, "*NEW*"))
if (rte->ref == NULL)
appendStringInfo(buf, "%s.",
quote_identifier(rte->relname));
else if (!strcmp(rte->ref->relname, "*NEW*"))
appendStringInfo(buf, "new.");
else if (!strcmp(rte->ref->relname, "*CURRENT*"))
appendStringInfo(buf, "old.");

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.22 2000/02/16 17:24:48 thomas Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.23 2000/03/14 23:06:37 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -952,6 +952,32 @@ interval_cmp(Interval *interval1, Interval *interval2)
return (span1 < span2) ? -1 : (span1 > span2) ? 1 : 0;
} /* interval_cmp() */
/* overlaps_timestamp()
* Implements the SQL92 OVERLAPS operator.
* Algorithm from Date and Darwen, 1997
*/
bool
overlaps_timestamp(Timestamp *ts1, Timestamp *te1, Timestamp *ts2, Timestamp *te2)
{
/* Make sure we have ordered pairs... */
if (timestamp_gt(ts1, te1))
{
Timestamp *tt = ts1;
ts1 = te1;
te1 = tt;
}
if (timestamp_gt(ts2, te2))
{
Timestamp *tt = ts2;
ts2 = te2;
te2 = tt;
}
return ((timestamp_gt(ts1, ts2) && (timestamp_lt(ts1, te2) || timestamp_lt(te1, te2)))
|| (timestamp_gt(ts2, ts1) && (timestamp_lt(ts2, te1) || timestamp_lt(te2, te1)))
|| timestamp_eq(ts1, ts2));
} /* overlaps_timestamp() */
/*----------------------------------------------------------
* "Arithmetic" operators on date/times.

View File

@ -8,7 +8,7 @@
#
#
# IDENTIFICATION
# $Header: /cvsroot/pgsql/src/bin/scripts/Attic/createlang.sh,v 1.6 2000/01/19 20:08:35 petere Exp $
# $Header: /cvsroot/pgsql/src/bin/scripts/Attic/createlang.sh,v 1.7 2000/03/14 23:06:41 thomas Exp $
#
#-------------------------------------------------------------------------
@ -241,11 +241,11 @@ if [ $? -ne 0 ]; then
echo "$CMDNAME: language installation failed"
exit 1
fi
$PSQL "CREATE ${trusted}PROCEDURAL LANGUAGE '$langname' HANDLER $handler LANCOMPILER '$lancomp'"
if [ $? -ne 0 ]; then
echo "$CMDNAME: language installation failed"
exit 1
fi
echo "Ok"
exit 0

View File

@ -37,7 +37,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: catversion.h,v 1.17 2000/02/27 18:06:28 tgl Exp $
* $Id: catversion.h,v 1.18 2000/03/14 23:06:42 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -53,6 +53,6 @@
*/
/* yyyymmddN */
#define CATALOG_VERSION_NO 200002271
#define CATALOG_VERSION_NO 200003141
#endif

View File

@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_aggregate.h,v 1.23 2000/02/16 17:26:06 thomas Exp $
* $Id: pg_aggregate.h,v 1.24 2000/03/14 23:06:42 thomas Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -114,6 +114,8 @@ DATA(insert OID = 0 ( max PGUID float4larger - - 700 700 0 700 _null_ _null_
DATA(insert OID = 0 ( max PGUID float8larger - - 701 701 0 701 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID int4larger - - 702 702 0 702 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID date_larger - - 1082 1082 0 1082 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID time_larger - - 1083 1083 0 1083 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID timetz_larger - - 1266 1266 0 1266 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID cashlarger - - 790 790 0 790 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID timestamp_larger - - 1184 1184 0 1184 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID interval_larger - - 1186 1186 0 1186 _null_ _null_ ));
@ -127,6 +129,8 @@ DATA(insert OID = 0 ( min PGUID float4smaller - - 700 700 0 700 _null_ _null
DATA(insert OID = 0 ( min PGUID float8smaller - - 701 701 0 701 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID int4smaller - - 702 702 0 702 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID date_smaller - - 1082 1082 0 1082 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID time_smaller - - 1083 1083 0 1083 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID timetz_smaller - - 1266 1266 0 1266 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID cashsmaller - - 790 790 0 790 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID timestamp_smaller - - 1184 1184 0 1184 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID interval_smaller - - 1186 1186 0 1186 _null_ _null_ ));

View File

@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_amop.h,v 1.31 2000/02/27 12:02:33 wieck Exp $
* $Id: pg_amop.h,v 1.32 2000/03/14 23:06:43 thomas Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -285,7 +285,17 @@ DATA(insert OID = 0 ( 403 1115 1113 4 ));
DATA(insert OID = 0 ( 403 1115 1112 5 ));
/*
* nbtree datetime_ops
* nbtree timetz_ops
*/
DATA(insert OID = 0 ( 403 1399 1552 1 ));
DATA(insert OID = 0 ( 403 1399 1553 2 ));
DATA(insert OID = 0 ( 403 1399 1550 3 ));
DATA(insert OID = 0 ( 403 1399 1555 4 ));
DATA(insert OID = 0 ( 403 1399 1554 5 ));
/*
* nbtree timestamp_ops
*/
DATA(insert OID = 0 ( 403 1312 1322 1 ));
@ -295,7 +305,7 @@ DATA(insert OID = 0 ( 403 1312 1325 4 ));
DATA(insert OID = 0 ( 403 1312 1324 5 ));
/*
* nbtree timespan_ops
* nbtree interval_ops
*/
DATA(insert OID = 0 ( 403 1313 1332 1 ));
@ -397,9 +407,11 @@ DATA(insert OID = 0 ( 405 1077 1062 1 ));
DATA(insert OID = 0 ( 405 1114 1093 1 ));
/* time_ops */
DATA(insert OID = 0 ( 405 1115 1108 1 ));
/* datetime_ops */
/* timetz_ops */
DATA(insert OID = 0 ( 405 1399 1550 1 ));
/* timestamp_ops */
DATA(insert OID = 0 ( 405 1312 1320 1 ));
/* timespan_ops */
/* interval_ops */
DATA(insert OID = 0 ( 405 1313 1330 1 ));
/* macaddr_ops */
DATA(insert OID = 0 ( 405 810 1220 1 ));

View File

@ -10,7 +10,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_amproc.h,v 1.21 2000/02/27 12:02:33 wieck Exp $
* $Id: pg_amproc.h,v 1.22 2000/03/14 23:06:43 thomas Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -95,12 +95,13 @@ DATA(insert OID = 0 (403 1115 1107 1));
DATA(insert OID = 0 (403 1181 359 1));
DATA(insert OID = 0 (403 1312 1314 1));
DATA(insert OID = 0 (403 1313 1315 1));
DATA(insert OID = 0 (403 810 836 1));
DATA(insert OID = 0 (403 935 926 1));
DATA(insert OID = 0 (403 652 926 1));
DATA(insert OID = 0 (403 810 836 1));
DATA(insert OID = 0 (403 935 926 1));
DATA(insert OID = 0 (403 652 926 1));
DATA(insert OID = 0 (403 1768 1769 1));
DATA(insert OID = 0 (403 1690 1693 1));
DATA(insert OID = 0 (403 1663 1636 1));
DATA(insert OID = 0 (403 1399 1358 1));
@ -120,5 +121,6 @@ DATA(insert OID = 0 (405 1115 452 1));
DATA(insert OID = 0 (405 1181 455 1));
DATA(insert OID = 0 (405 1312 452 1));
DATA(insert OID = 0 (405 1313 452 1));
DATA(insert OID = 0 (405 1399 452 1));
#endif /* PG_AMPROC_H */

View File

@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_opclass.h,v 1.30 2000/02/27 12:02:33 wieck Exp $
* $Id: pg_opclass.h,v 1.31 2000/03/14 23:06:43 thomas Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -63,64 +63,66 @@ typedef FormData_pg_opclass *Form_pg_opclass;
* (see the README in this directory), so just put zeros
* in, which are invalid OID's anyway. --djm
*/
DATA(insert OID = 421 ( int2_ops 21 ));
DATA(insert OID = 421 ( int2_ops 21 ));
DESCR("");
DATA(insert OID = 422 ( box_ops 603 ));
DATA(insert OID = 422 ( box_ops 603 ));
DESCR("");
DATA(insert OID = 423 ( float8_ops 701 ));
DATA(insert OID = 423 ( float8_ops 701 ));
DESCR("");
DATA(insert OID = 424 ( int24_ops 0 ));
DATA(insert OID = 424 ( int24_ops 0 ));
DESCR("");
DATA(insert OID = 425 ( int42_ops 0 ));
DATA(insert OID = 425 ( int42_ops 0 ));
DESCR("");
DATA(insert OID = 426 ( int4_ops 23 ));
DATA(insert OID = 426 ( int4_ops 23 ));
DESCR("");
#define INT4_OPS_OID 426
DATA(insert OID = 427 ( oid_ops 26 ));
DATA(insert OID = 427 ( oid_ops 26 ));
DESCR("");
DATA(insert OID = 428 ( float4_ops 700 ));
DATA(insert OID = 428 ( float4_ops 700 ));
DESCR("");
DATA(insert OID = 429 ( char_ops 18 ));
DATA(insert OID = 429 ( char_ops 18 ));
DESCR("");
DATA(insert OID = 431 ( text_ops 25 ));
DATA(insert OID = 431 ( text_ops 25 ));
DESCR("");
DATA(insert OID = 432 ( abstime_ops 702 ));
DATA(insert OID = 432 ( abstime_ops 702 ));
DESCR("");
DATA(insert OID = 433 ( bigbox_ops 603 ));
DATA(insert OID = 433 ( bigbox_ops 603 ));
DESCR("");
DATA(insert OID = 434 ( poly_ops 604 ));
DATA(insert OID = 434 ( poly_ops 604 ));
DESCR("");
DATA(insert OID = 435 ( oidvector_ops 30 ));
DATA(insert OID = 435 ( oidvector_ops 30 ));
DESCR("");
DATA(insert OID = 714 ( circle_ops 718 ));
DATA(insert OID = 714 ( circle_ops 718 ));
DESCR("");
DATA(insert OID = 754 ( int8_ops 20 ));
DATA(insert OID = 754 ( int8_ops 20 ));
DESCR("");
DATA(insert OID = 1076 ( bpchar_ops 1042 ));
DATA(insert OID = 1076 ( bpchar_ops 1042 ));
DESCR("");
DATA(insert OID = 1077 ( varchar_ops 1043 ));
DESCR("");
DATA(insert OID = 1114 ( date_ops 1082 ));
DATA(insert OID = 1114 ( date_ops 1082 ));
DESCR("");
DATA(insert OID = 1115 ( time_ops 1083 ));
DATA(insert OID = 1115 ( time_ops 1083 ));
DESCR("");
DATA(insert OID = 1181 ( name_ops 19 ));
DATA(insert OID = 1181 ( name_ops 19 ));
DESCR("");
DATA(insert OID = 1312 ( timestamp_ops 1184 ));
DESCR("");
DATA(insert OID = 1313 ( interval_ops 1186 ));
DESCR("");
DATA(insert OID = 810 ( macaddr_ops 829 ));
DATA(insert OID = 810 ( macaddr_ops 829 ));
DESCR("");
DATA(insert OID = 935 ( inet_ops 869 ));
DATA(insert OID = 935 ( inet_ops 869 ));
DESCR("");
DATA(insert OID = 652 ( cidr_ops 650 ));
DATA(insert OID = 652 ( cidr_ops 650 ));
DESCR("");
DATA(insert OID = 1768 ( numeric_ops 1700 ));
DATA(insert OID = 1768 ( numeric_ops 1700 ));
DESCR("");
DATA(insert OID = 1663 ( lztext_ops 1625 ));
DATA(insert OID = 1663 ( lztext_ops 1625 ));
DESCR("");
DATA(insert OID = 1690 ( bool_ops 16 ));
DATA(insert OID = 1690 ( bool_ops 16 ));
DESCR("");
DATA(insert OID = 1399 ( timetz_ops 1266 ));
DESCR("");
#endif /* PG_OPCLASS_H */

View File

@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_operator.h,v 1.71 2000/02/27 12:02:33 wieck Exp $
* $Id: pg_operator.h,v 1.72 2000/03/14 23:06:43 thomas Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -141,6 +141,8 @@ DATA(insert OID = 401 ( "=" PGUID 0 b t f 1034 1034 16 401 0 0 0 array_e
DATA(insert OID = 387 ( "=" PGUID 0 b t t 27 27 16 387 0 0 0 tideq eqsel eqjoinsel ));
#define TIDEqualOperator 387
DATA(insert OID = 388 ( "!" PGUID 0 r t f 20 0 20 0 0 0 0 int8fac - - ));
DATA(insert OID = 389 ( "!!" PGUID 0 l t f 0 20 20 0 0 0 0 int8fac - - ));
DATA(insert OID = 410 ( "=" PGUID 0 b t t 20 20 16 410 411 412 412 int8eq eqsel eqjoinsel ));
DATA(insert OID = 411 ( "<>" PGUID 0 b t f 20 20 16 411 410 0 0 int8ne neqsel neqjoinsel ));
@ -155,6 +157,8 @@ DATA(insert OID = 418 ( "<" PGUID 0 b t f 20 23 16 76 430 0 0 int84lt sc
DATA(insert OID = 419 ( ">" PGUID 0 b t f 20 23 16 37 420 0 0 int84gt scalargtsel scalargtjoinsel ));
DATA(insert OID = 420 ( "<=" PGUID 0 b t f 20 23 16 82 419 0 0 int84le scalarltsel scalarltjoinsel ));
DATA(insert OID = 430 ( ">=" PGUID 0 b t f 20 23 16 80 418 0 0 int84ge scalargtsel scalargtjoinsel ));
DATA(insert OID = 439 ( "%" PGUID 0 b t f 20 20 20 0 0 0 0 int8mod - - ));
DATA(insert OID = 473 ( "@" PGUID 0 l t f 0 20 20 0 0 0 0 int8abs - - ));
DATA(insert OID = 484 ( "-" PGUID 0 l t f 0 20 20 0 0 0 0 int8um - - ));
DATA(insert OID = 485 ( "<<" PGUID 0 b t f 604 604 16 0 0 0 0 poly_left positionsel positionjoinsel ));
@ -216,12 +220,12 @@ DATA(insert OID = 540 ( "<=" PGUID 0 b t f 21 23 16 543 536 0 0 int24le
DATA(insert OID = 541 ( "<=" PGUID 0 b t f 23 21 16 542 537 0 0 int42le scalarltsel scalarltjoinsel ));
DATA(insert OID = 542 ( ">=" PGUID 0 b t f 21 23 16 541 534 0 0 int24ge scalargtsel scalargtjoinsel ));
DATA(insert OID = 543 ( ">=" PGUID 0 b t f 23 21 16 540 535 0 0 int42ge scalargtsel scalargtjoinsel ));
DATA(insert OID = 544 ( "*" PGUID 0 b t f 21 23 23 545 0 0 0 int24mul - - ));
DATA(insert OID = 545 ( "*" PGUID 0 b t f 23 21 23 544 0 0 0 int42mul - - ));
DATA(insert OID = 546 ( "/" PGUID 0 b t f 21 23 23 0 0 0 0 int24div - - ));
DATA(insert OID = 547 ( "/" PGUID 0 b t f 23 21 23 0 0 0 0 int42div - - ));
DATA(insert OID = 548 ( "%" PGUID 0 b t f 21 23 23 0 0 0 0 int24mod - - ));
DATA(insert OID = 549 ( "%" PGUID 0 b t f 23 21 23 0 0 0 0 int42mod - - ));
DATA(insert OID = 544 ( "*" PGUID 0 b t f 21 23 23 545 0 0 0 int24mul - - ));
DATA(insert OID = 545 ( "*" PGUID 0 b t f 23 21 23 544 0 0 0 int42mul - - ));
DATA(insert OID = 546 ( "/" PGUID 0 b t f 21 23 23 0 0 0 0 int24div - - ));
DATA(insert OID = 547 ( "/" PGUID 0 b t f 23 21 23 0 0 0 0 int42div - - ));
DATA(insert OID = 548 ( "%" PGUID 0 b t f 21 23 23 0 0 0 0 int24mod - - ));
DATA(insert OID = 549 ( "%" PGUID 0 b t f 23 21 23 0 0 0 0 int42mod - - ));
DATA(insert OID = 550 ( "+" PGUID 0 b t f 21 21 21 550 0 0 0 int2pl - - ));
DATA(insert OID = 551 ( "+" PGUID 0 b t f 23 23 23 551 0 0 0 int4pl - - ));
DATA(insert OID = 552 ( "+" PGUID 0 b t f 21 23 23 553 0 0 0 int24pl - - ));
@ -272,10 +276,10 @@ DATA(insert OID = 596 ( "|/" PGUID 0 l t f 0 701 701 0 0 0 0 dsqrt
DATA(insert OID = 597 ( "||/" PGUID 0 l t f 0 701 701 0 0 0 0 dcbrt - - ));
DATA(insert OID = 598 ( "%" PGUID 0 l t f 0 701 701 0 0 0 0 dtrunc - - ));
DATA(insert OID = 599 ( "%" PGUID 0 r t f 701 0 701 0 0 0 0 dround - - ));
DATA(insert OID = 1282 ( ":" PGUID 0 l t f 0 701 701 0 0 0 0 dexp - - ));
DATA(insert OID = 1283 ( ";" PGUID 0 l t f 0 701 701 0 0 0 0 dlog1 - - ));
DATA(insert OID = 1284 ( "|" PGUID 0 l t f 0 704 702 0 0 0 0 tintervalstart - - ));
DATA(insert OID = 606 ( "<#>" PGUID 0 b t f 702 702 704 0 0 0 0 mktinterval - - ));
DATA(insert OID = 1282 ( ":" PGUID 0 l t f 0 701 701 0 0 0 0 dexp - - ));
DATA(insert OID = 1283 ( ";" PGUID 0 l t f 0 701 701 0 0 0 0 dlog1 - - ));
DATA(insert OID = 1284 ( "|" PGUID 0 l t f 0 704 702 0 0 0 0 tintervalstart - - ));
DATA(insert OID = 606 ( "<#>" PGUID 0 b t f 702 702 704 0 0 0 0 mktinterval - - ));
DATA(insert OID = 607 ( "=" PGUID 0 b t t 26 26 16 607 608 609 609 oideq eqsel eqjoinsel ));
#define MIN_OIDCMP 607 /* used by cache code */
DATA(insert OID = 608 ( "<>" PGUID 0 b t f 26 26 16 608 607 0 0 oidne neqsel neqjoinsel ));
@ -344,6 +348,7 @@ DATA(insert OID = 673 ( "<=" PGUID 0 b t f 701 701 16 675 674 0 0 float8le
DATA(insert OID = 674 ( ">" PGUID 0 b t f 701 701 16 672 673 0 0 float8gt scalargtsel scalargtjoinsel ));
DATA(insert OID = 675 ( ">=" PGUID 0 b t f 701 701 16 673 672 0 0 float8ge scalargtsel scalargtjoinsel ));
DATA(insert OID = 682 ( "@" PGUID 0 l t f 0 21 21 0 0 0 0 int2abs - - ));
DATA(insert OID = 684 ( "+" PGUID 0 b t f 20 20 20 684 0 0 0 int8pl - - ));
DATA(insert OID = 685 ( "-" PGUID 0 b t f 20 20 20 0 0 0 0 int8mi - - ));
DATA(insert OID = 686 ( "*" PGUID 0 b t f 20 20 20 686 0 0 0 int8mul - - ));
@ -379,6 +384,8 @@ DATA(insert OID = 757 ( "~" PGUID 0 b t f 604 600 16 756 0 0 0 poly_con
DATA(insert OID = 758 ( "@" PGUID 0 b t f 600 718 16 759 0 0 0 pt_contained_circle - - ));
DATA(insert OID = 759 ( "~" PGUID 0 b t f 718 600 16 758 0 0 0 circle_contain_pt - - ));
DATA(insert OID = 773 ( "@" PGUID 0 l t f 0 23 23 0 0 0 0 int4abs - - ));
/* additional operators for geometric types - thomas 1997-07-09 */
DATA(insert OID = 792 ( "=" PGUID 0 b t f 602 602 16 792 0 0 0 path_n_eq eqsel eqjoinsel ));
DATA(insert OID = 793 ( "<" PGUID 0 b t f 602 602 16 794 0 0 0 path_n_lt - - ));
@ -480,6 +487,14 @@ DATA(insert OID = 1111 ( "<=" PGUID 0 b t f 1083 1083 16 1113 1112 0 0 time
DATA(insert OID = 1112 ( ">" PGUID 0 b t f 1083 1083 16 1110 1111 0 0 time_gt scalargtsel scalargtjoinsel ));
DATA(insert OID = 1113 ( ">=" PGUID 0 b t f 1083 1083 16 1111 1110 0 0 time_ge scalargtsel scalargtjoinsel ));
/* timetz operators */
DATA(insert OID = 1550 ( "=" PGUID 0 b t f 1266 1266 16 1550 1551 1552 1552 timetz_eq eqsel eqjoinsel ));
DATA(insert OID = 1551 ( "<>" PGUID 0 b t f 1266 1266 16 1551 1550 0 0 timetz_ne neqsel neqjoinsel ));
DATA(insert OID = 1552 ( "<" PGUID 0 b t f 1266 1266 16 1554 1555 0 0 timetz_lt scalarltsel scalarltjoinsel ));
DATA(insert OID = 1553 ( "<=" PGUID 0 b t f 1266 1266 16 1555 1554 0 0 timetz_le scalarltsel scalarltjoinsel ));
DATA(insert OID = 1554 ( ">" PGUID 0 b t f 1266 1266 16 1552 1553 0 0 timetz_gt scalargtsel scalargtjoinsel ));
DATA(insert OID = 1555 ( ">=" PGUID 0 b t f 1266 1266 16 1553 1552 0 0 timetz_ge scalargtsel scalargtjoinsel ));
/* float48 operators */
DATA(insert OID = 1116 ( "+" PGUID 0 b t f 700 701 701 1126 0 0 0 float48pl - - ));
DATA(insert OID = 1117 ( "-" PGUID 0 b t f 700 701 701 0 0 0 0 float48mi - - ));
@ -505,8 +520,11 @@ DATA(insert OID = 1134 ( "<=" PGUID 0 b t f 701 700 16 1125 1133 0 0 float8
DATA(insert OID = 1135 ( ">=" PGUID 0 b t f 701 700 16 1124 1132 0 0 float84ge scalargtsel scalargtjoinsel ));
/* int4 and oid equality */
DATA(insert OID = 1136 ( "=" PGUID 0 b t t 23 26 16 1137 0 0 0 int4eqoid eqsel eqjoinsel ));
DATA(insert OID = 1137 ( "=" PGUID 0 b t t 26 23 16 1136 0 0 0 oideqint4 eqsel eqjoinsel ));
DATA(insert OID = 1136 ( "=" PGUID 0 b t t 23 26 16 1137 0 0 0 int4eqoid eqsel eqjoinsel ));
DATA(insert OID = 1137 ( "=" PGUID 0 b t t 26 23 16 1136 0 0 0 oideqint4 eqsel eqjoinsel ));
DATA(insert OID = 1158 ( "!" PGUID 0 r t f 21 0 23 0 0 0 0 int2fac - - ));
DATA(insert OID = 1175 ( "!!" PGUID 0 l t f 0 21 23 0 0 0 0 int2fac - - ));
/* LIKE hacks by Keith Parks. */
DATA(insert OID = 1207 ( "~~" PGUID 0 b t f 19 25 16 0 1208 0 0 namelike eqsel eqjoinsel ));
@ -544,7 +562,6 @@ DATA(insert OID = 1322 ( "<" PGUID 0 b t f 1184 1184 16 1324 1325 0 0 times
DATA(insert OID = 1323 ( "<=" PGUID 0 b t f 1184 1184 16 1325 1324 0 0 timestamp_le scalarltsel scalarltjoinsel ));
DATA(insert OID = 1324 ( ">" PGUID 0 b t f 1184 1184 16 1322 1323 0 0 timestamp_gt scalargtsel scalargtjoinsel ));
DATA(insert OID = 1325 ( ">=" PGUID 0 b t f 1184 1184 16 1323 1322 0 0 timestamp_ge scalargtsel scalargtjoinsel ));
DATA(insert OID = 1327 ( "+" PGUID 0 b t f 1184 1186 1184 0 0 0 0 timestamp_pl_span - - ));
DATA(insert OID = 1328 ( "-" PGUID 0 b t f 1184 1184 1186 0 0 0 0 timestamp_mi - - ));
DATA(insert OID = 1329 ( "-" PGUID 0 b t f 1184 1186 1184 0 0 0 0 timestamp_mi_span - - ));
@ -561,6 +578,11 @@ DATA(insert OID = 1336 ( "-" PGUID 0 l t f 0 1186 1186 0 0 0 0 interval_u
DATA(insert OID = 1337 ( "+" PGUID 0 b t f 1186 1186 1186 1337 0 0 0 interval_pl - - ));
DATA(insert OID = 1338 ( "-" PGUID 0 b t f 1186 1186 1186 0 0 0 0 interval_mi - - ));
DATA(insert OID = 1360 ( "+" PGUID 0 b t f 1082 1083 1184 0 0 0 0 datetime_pl - - ));
DATA(insert OID = 1361 ( "+" PGUID 0 b t f 1082 1266 1184 0 0 0 0 datetimetz_pl - - ));
DATA(insert OID = 1363 ( "+" PGUID 0 b t f 1083 1082 1184 0 0 0 0 timedate_pl - - ));
DATA(insert OID = 1366 ( "+" PGUID 0 b t f 1266 1082 1184 0 0 0 0 timetzdate_pl - - ));
/* additional geometric operators - thomas 97/04/18 */
DATA(insert OID = 1420 ( "@@" PGUID 0 l t f 0 718 600 0 0 0 0 circle_center - - ));
DATA(insert OID = 1500 ( "=" PGUID 0 b t f 718 718 16 1500 1501 1502 1502 circle_eq eqsel eqjoinsel ));
@ -670,6 +692,7 @@ DATA(insert OID = 828 ( ">>" PGUID 0 b t f 650 650 16 826 0 0 0 network_s
DATA(insert OID = 1004 ( ">>=" PGUID 0 b t f 650 650 16 827 0 0 0 network_supeq - - ));
/* NUMERIC type - OID's 1700-1799 */
DATA(insert OID = 1751 ( "-" PGUID 0 l t f 0 1700 1700 0 0 0 0 numeric_uminus - - ));
DATA(insert OID = 1752 ( "=" PGUID 0 b t f 1700 1700 16 1752 1753 1754 1754 numeric_eq eqsel eqjoinsel ));
DATA(insert OID = 1753 ( "<>" PGUID 0 b t f 1700 1700 16 1753 1752 0 0 numeric_ne neqsel neqjoinsel ));
DATA(insert OID = 1754 ( "<" PGUID 0 b t f 1700 1700 16 1756 1757 0 0 numeric_lt scalarltsel scalarltjoinsel ));
@ -682,7 +705,6 @@ DATA(insert OID = 1760 ( "*" PGUID 0 b t f 1700 1700 1700 1760 0 0 0 numeric
DATA(insert OID = 1761 ( "/" PGUID 0 b t f 1700 1700 1700 0 0 0 0 numeric_div - - ));
DATA(insert OID = 1762 ( "%" PGUID 0 b t f 1700 1700 1700 0 0 0 0 numeric_mod - - ));
DATA(insert OID = 1763 ( "@" PGUID 0 l t f 0 1700 1700 0 0 0 0 numeric_abs - - ));
DATA(insert OID = 1788 ( "-" PGUID 0 l t f 0 1700 1700 0 0 0 0 numeric_uminus - - ));
/* LZTEXT type */
DATA(insert OID = 1657 ( "=" PGUID 0 b t f 1625 1625 16 1657 1658 1659 1659 lztext_eq eqsel eqjoinsel ));

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_type.h,v 1.84 2000/02/27 12:02:34 wieck Exp $
* $Id: pg_type.h,v 1.85 2000/03/14 23:06:45 thomas Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@ -377,6 +377,10 @@ DATA(insert OID = 1187 ( _interval PGUID -1 -1 f b t \054 0 1186 array_in array
/* OIDS 1200 - 1299 */
DATA(insert OID = 1231 ( _numeric PGUID -1 -1 f b t \054 0 1700 array_in array_out array_in array_out i _null_ ));
DATA(insert OID = 1266 ( timetz PGUID 12 22 f b t \054 0 0 timetz_in timetz_out timetz_in timetz_out d _null_ ));
DESCR("hh:mm:ss, ANSI SQL time");
#define TIMETZOID 1266
DATA(insert OID = 1270 ( _timetz PGUID -1 -1 f b t \054 0 1266 array_in array_out array_in array_out d _null_ ));
/* OIDS 1700 - 1799 */
DATA(insert OID = 1700 ( numeric PGUID -1 -1 f b t \054 0 0 numeric_in numeric_out numeric_in numeric_out i _null_ ));

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: parsenodes.h,v 1.101 2000/03/01 05:18:18 tgl Exp $
* $Id: parsenodes.h,v 1.102 2000/03/14 23:06:47 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -614,6 +614,7 @@ typedef struct ViewStmt
{
NodeTag type;
char *viewname; /* name of the view */
List *aliases; /* target column names */
Query *query; /* the SQL statement */
} ViewStmt;
@ -1131,6 +1132,12 @@ typedef struct TargetEntry
* Some of the following are only used in one of
* the parsing, optimizing, execution stages.
*
* eref is the expanded table name and columns for the underlying
* relation. Note that for outer join syntax, allowed reference names
* could be modified as one evaluates the nested clauses (e.g.
* "SELECT ... FROM t1 NATURAL JOIN t2 WHERE ..." forbids explicit mention
* of a table name in any reference to the join column.
*
* inFromCl marks those range variables that are listed in the FROM clause.
* In SQL, the query can only refer to range variables listed in the
* FROM clause, but POSTQUEL allows you to refer to tables not listed,
@ -1157,9 +1164,8 @@ typedef struct RangeTblEntry
{
NodeTag type;
char *relname; /* real name of the relation */
#ifndef DISABLE_JOIN_SYNTAX
Attr *ref; /* reference names (given in FROM clause) */
#endif
Attr *eref; /* expanded reference names */
Oid relid; /* OID of the relation */
bool inh; /* inheritance requested? */
bool inFromCl; /* present in FROM clause */

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: parse_coerce.h,v 1.18 2000/02/16 17:26:16 thomas Exp $
* $Id: parse_coerce.h,v 1.19 2000/03/14 23:06:48 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -53,6 +53,9 @@ typedef enum CATEGORY
|| ((t) == INTERVALOID) \
|| ((t) == ABSTIMEOID) \
|| ((t) == RELTIMEOID) \
|| ((t) == DATEOID) \
|| ((t) == TIMEOID) \
|| ((t) == TIMETZOID) \
|| ((t) == CHAROID) \
|| ((t) == NAMEOID) \
|| ((t) == CASHOID) \

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: builtins.h,v 1.105 2000/02/27 12:02:34 wieck Exp $
* $Id: builtins.h,v 1.106 2000/03/14 23:06:50 thomas Exp $
*
* NOTES
* This should normally only be included by fmgr.h.
@ -116,12 +116,14 @@ extern int32 int4pl(int32 arg1, int32 arg2);
extern int32 int4mi(int32 arg1, int32 arg2);
extern int32 int4mul(int32 arg1, int32 arg2);
extern int32 int4div(int32 arg1, int32 arg2);
extern int32 int4abs(int32 arg);
extern int32 int4inc(int32 arg);
extern int16 int2um(int16 arg);
extern int16 int2pl(int16 arg1, int16 arg2);
extern int16 int2mi(int16 arg1, int16 arg2);
extern int16 int2mul(int16 arg1, int16 arg2);
extern int16 int2div(int16 arg1, int16 arg2);
extern int16 int2abs(int16 arg);
extern int16 int2inc(int16 arg);
extern int32 int24pl(int32 arg1, int32 arg2);
extern int32 int24mi(int32 arg1, int32 arg2);
@ -268,6 +270,7 @@ extern float64 dcbrt(float64 arg1);
extern float64 dpow(float64 arg1, float64 arg2);
extern float64 dexp(float64 arg1);
extern float64 dlog1(float64 arg1);
extern float64 dlog10(float64 arg1);
extern float64 float48pl(float32 arg1, float64 arg2);
extern float64 float48mi(float32 arg1, float64 arg2);
extern float64 float48mul(float32 arg1, float64 arg2);
@ -468,9 +471,11 @@ extern text *upper(text *string);
extern text *initcap(text *string);
extern text *lpad(text *string1, int4 len, text *string2);
extern text *rpad(text *string1, int4 len, text *string2);
extern text *btrim(text *string, text *set);
extern text *ltrim(text *string, text *set);
extern text *rtrim(text *string, text *set);
extern text *translate(text *string, char from, char to);
extern text *substr(text *string, int4 m, int4 n);
extern text *translate(text *string, text *from, text *to);
/* acl.c */

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: date.h,v 1.1 2000/02/16 17:26:26 thomas Exp $
* $Id: date.h,v 1.2 2000/03/14 23:06:50 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -18,6 +18,12 @@ typedef int32 DateADT;
typedef float8 TimeADT;
typedef struct
{
double time; /* all time units other than months and years */
int4 zone; /* numeric time zone, in seconds */
} TimeTzADT;
/* date.c */
extern DateADT date_in(char *datestr);
extern char *date_out(DateADT dateVal);
@ -46,7 +52,31 @@ extern bool time_lt(TimeADT *time1, TimeADT *time2);
extern bool time_le(TimeADT *time1, TimeADT *time2);
extern bool time_gt(TimeADT *time1, TimeADT *time2);
extern bool time_ge(TimeADT *time1, TimeADT *time2);
extern int time_cmp(TimeADT *time1, TimeADT *time2);
extern int time_cmp(TimeADT *time1, TimeADT *time2);
extern bool overlaps_time(TimeADT *time1, TimeADT *time2,
TimeADT *time3, TimeADT *time4);
extern TimeADT *time_larger(TimeADT *time1, TimeADT *time2);
extern TimeADT *time_smaller(TimeADT *time1, TimeADT *time2);
extern TimeADT *timestamp_time(Timestamp *timestamp);
extern Interval *time_interval(TimeADT *time);
extern TimeTzADT *timetz_in(char *timestr);
extern char *timetz_out(TimeTzADT *time);
extern bool timetz_eq(TimeTzADT *time1, TimeTzADT *time2);
extern bool timetz_ne(TimeTzADT *time1, TimeTzADT *time2);
extern bool timetz_lt(TimeTzADT *time1, TimeTzADT *time2);
extern bool timetz_le(TimeTzADT *time1, TimeTzADT *time2);
extern bool timetz_gt(TimeTzADT *time1, TimeTzADT *time2);
extern bool timetz_ge(TimeTzADT *time1, TimeTzADT *time2);
extern int timetz_cmp(TimeTzADT *time1, TimeTzADT *time2);
extern bool overlaps_timetz(TimeTzADT *time1, TimeTzADT *time2,
TimeTzADT *time3, TimeTzADT *time4);
extern TimeTzADT *timetz_larger(TimeTzADT *time1, TimeTzADT *time2);
extern TimeTzADT *timetz_smaller(TimeTzADT *time1, TimeTzADT *time2);
extern TimeTzADT *timestamp_timetz(Timestamp *timestamp);
extern Timestamp *datetimetz_timestamp(DateADT date, TimeTzADT *time);
#endif /* DATE_H */

View File

@ -9,7 +9,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: datetime.h,v 1.10 2000/02/16 17:26:26 thomas Exp $
* $Id: datetime.h,v 1.11 2000/03/14 23:06:50 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -21,32 +21,6 @@
#include <limits.h>
#include "utils/timestamp.h"
#if 0
/*
* Timestamp represents absolute time.
* TimeSpan represents delta time. Keep track of months (and years)
* separately since the elapsed time spanned is unknown until instantiated
* relative to an absolute time.
*
* Note that Postgres uses "time interval" to mean a bounded interval,
* consisting of a beginning and ending time, not a time span - thomas 97/03/20
*/
typedef double Timestamp;
typedef struct
{
double time; /* all time units other than months and
* years */
int4 month; /* months and years, after time for
* alignment */
} TimeSpan;
#endif
/* ----------------------------------------------------------------
* time types + support macros
@ -209,74 +183,6 @@ typedef struct
} datetkn;
#if 0
#ifdef NAN
#define TIMESTAMP_INVALID (NAN)
#else
#define TIMESTAMP_INVALID (DBL_MIN+DBL_MIN)
#endif
#ifdef HUGE_VAL
#define TIMESTAMP_NOBEGIN (-HUGE_VAL)
#define TIMESTAMP_NOEND (HUGE_VAL)
#else
#define TIMESTAMP_NOBEGIN (-DBL_MAX)
#define TIMESTAMP_NOEND (DBL_MAX)
#endif
#define TIMESTAMP_CURRENT (DBL_MIN)
#define TIMESTAMP_EPOCH (-DBL_MIN)
#define TIMESTAMP_INVALID(j) {j = TIMESTAMP_INVALID;}
#ifdef NAN
#define TIMESTAMP_IS_INVALID(j) (isnan(j))
#else
#define TIMESTAMP_IS_INVALID(j) (j == TIMESTAMP_INVALID)
#endif
#define TIMESTAMP_NOBEGIN(j) {j = DT_NOBEGIN;}
#define TIMESTAMP_IS_NOBEGIN(j) (j == TIMESTAMP_NOBEGIN)
#define TIMESTAMP_NOEND(j) {j = TIMESTAMP_NOEND;}
#define TIMESTAMP_IS_NOEND(j) (j == TIMESTAMP_NOEND)
#define TIMESTAMP_CURRENT(j) {j = TIMESTAMP_CURRENT;}
#if defined(linux) && defined(__powerpc__)
extern int timestamp_is_current(double j);
#define TIMESTAMP_IS_CURRENT(j) timestamp_is_current(j)
#else
#define TIMESTAMP_IS_CURRENT(j) (j == TIMESTAMP_CURRENT)
#endif
#define TIMESTAMP_EPOCH(j) {j = TIMESTAMP_EPOCH;}
#if defined(linux) && defined(__powerpc__)
extern int timestamp_is_epoch(double j);
#define TIMESTAMP_IS_EPOCH(j) timestamp_is_epoch(j)
#else
#define TIMESTAMP_IS_EPOCH(j) (j == TIMESTAMP_EPOCH)
#endif
#define TIMESTAMP_IS_RELATIVE(j) (TIMESTAMP_IS_CURRENT(j) || TIMESTAMP_IS_EPOCH(j))
#define TIMESTAMP_NOT_FINITE(j) (TIMESTAMP_IS_INVALID(j) \
|| TIMESTAMP_IS_NOBEGIN(j) || TIMESTAMP_IS_NOEND(j))
#define TIMESTAMP_IS_RESERVED(j) (TIMESTAMP_IS_RELATIVE(j) || TIMESTAMP_NOT_FINITE(j))
#define TIMESPAN_INVALID(j) {(j).time = DT_INVALID;}
#ifdef NAN
#define TIMESPAN_IS_INVALID(j) (isnan((j).time))
#else
#define TIMESPAN_IS_INVALID(j) ((j).time == DATETIME_INVALID)
#endif
#define TIMESPAN_NOT_FINITE(j) TIMESPAN_IS_INVALID(j)
#define TIME_PREC_INV 1000000.0
#define JROUND(j) (rint(((double) (j))*TIME_PREC_INV)/TIME_PREC_INV)
#endif
/* TMODULO()
* Macro to replace modf(), which is broken on some platforms.
*/
@ -325,63 +231,6 @@ extern int day_tab[2][13];
|| ((m == UTIME_MAXMONTH) && (d <= UTIME_MAXDAY))))))
#if 0
/*
* datetime.c prototypes
*/
extern DateTime *datetime_in(char *str);
extern char *datetime_out(DateTime *dt);
extern bool datetime_eq(DateTime *dt1, DateTime *dt2);
extern bool datetime_ne(DateTime *dt1, DateTime *dt2);
extern bool datetime_lt(DateTime *dt1, DateTime *dt2);
extern bool datetime_le(DateTime *dt1, DateTime *dt2);
extern bool datetime_ge(DateTime *dt1, DateTime *dt2);
extern bool datetime_gt(DateTime *dt1, DateTime *dt2);
extern bool datetime_finite(DateTime *datetime);
extern int datetime_cmp(DateTime *dt1, DateTime *dt2);
extern DateTime *datetime_smaller(DateTime *dt1, DateTime *dt2);
extern DateTime *datetime_larger(DateTime *dt1, DateTime *dt2);
extern TimeSpan *timespan_in(char *str);
extern char *timespan_out(TimeSpan *span);
extern bool timespan_eq(TimeSpan *span1, TimeSpan *span2);
extern bool timespan_ne(TimeSpan *span1, TimeSpan *span2);
extern bool timespan_lt(TimeSpan *span1, TimeSpan *span2);
extern bool timespan_le(TimeSpan *span1, TimeSpan *span2);
extern bool timespan_ge(TimeSpan *span1, TimeSpan *span2);
extern bool timespan_gt(TimeSpan *span1, TimeSpan *span2);
extern bool timespan_finite(TimeSpan *span);
extern int timespan_cmp(TimeSpan *span1, TimeSpan *span2);
extern TimeSpan *timespan_smaller(TimeSpan *span1, TimeSpan *span2);
extern TimeSpan *timespan_larger(TimeSpan *span1, TimeSpan *span2);
extern text *datetime_text(DateTime *datetime);
extern DateTime *text_datetime(text *str);
extern text *timespan_text(TimeSpan *timespan);
extern TimeSpan *text_timespan(text *str);
extern DateTime *datetime_trunc(text *units, DateTime *datetime);
extern TimeSpan *timespan_trunc(text *units, TimeSpan *timespan);
extern float64 datetime_part(text *units, DateTime *datetime);
extern float64 timespan_part(text *units, TimeSpan *timespan);
extern text *datetime_zone(text *zone, DateTime *datetime);
extern TimeSpan *timespan_um(TimeSpan *span);
extern TimeSpan *timespan_pl(TimeSpan *span1, TimeSpan *span2);
extern TimeSpan *timespan_mi(TimeSpan *span1, TimeSpan *span2);
extern TimeSpan *timespan_div(TimeSpan *span1, float8 *arg2);
extern TimeSpan *datetime_mi(DateTime *dt1, DateTime *dt2);
extern DateTime *datetime_pl_span(DateTime *dt, TimeSpan *span);
extern DateTime *datetime_mi_span(DateTime *dt, TimeSpan *span);
extern TimeSpan *datetime_age(DateTime *dt1, DateTime *dt2);
#endif
extern void GetCurrentTime(struct tm * tm);
extern void j2date(int jd, int *year, int *month, int *day);
extern int date2j(int year, int month, int day);
@ -393,15 +242,16 @@ extern int DecodeDateTime(char **field, int *ftype,
int nf, int *dtype,
struct tm * tm, double *fsec, int *tzp);
extern int DecodeTimeOnly(char **field, int *ftype, int nf,
int *dtype, struct tm * tm, double *fsec);
extern int DecodeTimeOnly(char **field, int *ftype,
int nf, int *dtype,
struct tm * tm, double *fsec, int *tzp);
extern int DecodeDateDelta(char **field, int *ftype,
int nf, int *dtype,
struct tm * tm, double *fsec);
extern int EncodeDateOnly(struct tm * tm, int style, char *str);
extern int EncodeTimeOnly(struct tm * tm, double fsec, int style, char *str);
extern int EncodeTimeOnly(struct tm * tm, double fsec, int *tzp, int style, char *str);
extern int EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, char *str);
extern int EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str);
@ -421,18 +271,4 @@ extern datetkn *datebsearch(char *key, datetkn *base, unsigned int nel);
extern int j2day(int jd);
#if 0
static int EncodeSpecialTimestamp(Timestamp dt, char *str);
static Timestamp dt2local(Timestamp dt, int timezone);
static void dt2time(Timestamp dt, int *hour, int *min, double *sec);
static int timespan2tm(TimeSpan span, struct tm * tm, float8 *fsec);
static int tm2timespan(struct tm * tm, double fsec, TimeSpan *span);
#endif
#endif /* DATETIME_H */

View File

@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: geo_decls.h,v 1.25 2000/02/17 03:39:51 tgl Exp $
* $Id: geo_decls.h,v 1.26 2000/03/14 23:06:50 thomas Exp $
*
* NOTE
* These routines do *not* use the float types from adt/.
@ -284,8 +284,6 @@ extern PATH *path_add_pt(PATH *path, Point *point);
extern PATH *path_sub_pt(PATH *path, Point *point);
extern PATH *path_mul_pt(PATH *path, Point *point);
extern PATH *path_div_pt(PATH *path, Point *point);
extern bool path_contain_pt(PATH *path, Point *p);
extern bool pt_contained_path(Point *p, PATH *path);
extern Point *path_center(PATH *path);
extern POLYGON *path_poly(PATH *path);

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: int8.h,v 1.18 2000/02/21 03:36:59 tgl Exp $
* $Id: int8.h,v 1.19 2000/03/14 23:06:50 thomas Exp $
*
* NOTES
* These data types are supported on all 64-bit architectures, and may
@ -76,6 +76,9 @@ extern int64 *int8pl(int64 *val1, int64 *val2);
extern int64 *int8mi(int64 *val1, int64 *val2);
extern int64 *int8mul(int64 *val1, int64 *val2);
extern int64 *int8div(int64 *val1, int64 *val2);
extern int64 *int8abs(int64 *val1);
extern int64 *int8fac(int64 *val1);
extern int64 *int8mod(int64 *val1, int64 *val2);
extern int64 *int8larger(int64 *val1, int64 *val2);
extern int64 *int8smaller(int64 *val1, int64 *val2);

View File

@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: timestamp.h,v 1.1 2000/02/16 17:26:26 thomas Exp $
* $Id: timestamp.h,v 1.2 2000/03/14 23:06:51 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -31,10 +31,8 @@ typedef double Timestamp;
typedef struct
{
double time; /* all time units other than months and
* years */
int4 month; /* months and years, after time for
* alignment */
double time; /* all time units other than months and years */
int4 month; /* months and years, after time for alignment */
} Interval;
@ -101,49 +99,6 @@ extern int timestamp_is_epoch(double j);
#define JROUND(j) (rint(((double) (j))*TIME_PREC_INV)/TIME_PREC_INV)
#if 0
/*
* Date/time validation
* Include check for leap year.
*/
extern int day_tab[2][13];
#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
/* Julian date support for date2j() and j2date()
* Set the minimum year to one greater than the year of the first valid day
* to avoid having to check year and day both. - tgl 97/05/08
*/
#define JULIAN_MINYEAR (-4713)
#define JULIAN_MINMONTH (11)
#define JULIAN_MINDAY (23)
#define IS_VALID_JULIAN(y,m,d) ((y > JULIAN_MINYEAR) \
|| ((y == JULIAN_MINYEAR) && ((m > JULIAN_MINMONTH) \
|| ((m == JULIAN_MINMONTH) && (d >= JULIAN_MINDAY)))))
#define UTIME_MINYEAR (1901)
#define UTIME_MINMONTH (12)
#define UTIME_MINDAY (14)
#define UTIME_MAXYEAR (2038)
#define UTIME_MAXMONTH (01)
#define UTIME_MAXDAY (18)
#define IS_VALID_UTIME(y,m,d) (((y > UTIME_MINYEAR) \
|| ((y == UTIME_MINYEAR) && ((m > UTIME_MINMONTH) \
|| ((m == UTIME_MINMONTH) && (d >= UTIME_MINDAY))))) \
&& ((y < UTIME_MAXYEAR) \
|| ((y == UTIME_MAXYEAR) && ((m < UTIME_MAXMONTH) \
|| ((m == UTIME_MAXMONTH) && (d <= UTIME_MAXDAY))))))
#endif
/*
* timestamp.c prototypes
*/
@ -193,9 +148,10 @@ extern Interval *timestamp_mi(Timestamp *dt1, Timestamp *dt2);
extern Timestamp *timestamp_pl_span(Timestamp *dt, Interval *span);
extern Timestamp *timestamp_mi_span(Timestamp *dt, Interval *span);
extern Interval *timestamp_age(Timestamp *dt1, Timestamp *dt2);
extern bool overlaps_timestamp(Timestamp *dt1, Timestamp *dt2, Timestamp *dt3, Timestamp *dt4);
extern int tm2timestamp(struct tm * tm, double fsec, int *tzp, Timestamp *dt);
extern int timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, double *fsec, char **tzn);
extern int tm2timestamp(struct tm * tm, double fsec, int *tzp, Timestamp *dt);
extern int timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, double *fsec, char **tzn);
extern Timestamp SetTimestamp(Timestamp timestamp);
extern Timestamp dt2local(Timestamp dt, int timezone);

View File

@ -291,5 +291,7 @@ DELETE FROM tmp3 where a=5;
-- Try (and succeed)
ALTER TABLE tmp3 add constraint tmpconstr foreign key (a) references tmp2 match full;
NOTICE: ALTER TABLE ... ADD CONSTRAINT will create implicit trigger(s) for FOREIGN KEY check(s)
DROP TABLE tmp3
DROP TABLE tmp2
DROP TABLE tmp3;
NOTICE: DROP TABLE implicitly drops referential integrity trigger from table "tmp2"
NOTICE: DROP TABLE implicitly drops referential integrity trigger from table "tmp2"
DROP TABLE tmp2;

View File

@ -36,7 +36,7 @@ SELECT '' AS four, BOX_TBL.*;
| (3,3),(3,3)
(4 rows)
SELECT '' AS four, b.*, box_area(b.f1) as barea
SELECT '' AS four, b.*, area(b.f1) as barea
FROM BOX_TBL b;
four | f1 | barea
------+---------------------+-------

View File

@ -40,7 +40,7 @@ ERROR: Attribute 'foobar' not found
-- missing relation name (this had better not wildcard!)
delete from;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- no such relation
delete from nonesuch;
ERROR: Relation 'nonesuch' does not exist
@ -49,7 +49,7 @@ ERROR: Relation 'nonesuch' does not exist
-- missing relation name (this had better not wildcard!)
drop table;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- no such relation
drop table nonesuch;
ERROR: Relation 'nonesuch' does not exist
@ -59,7 +59,7 @@ ERROR: Relation 'nonesuch' does not exist
-- relation renaming
-- missing relation name
alter table rename;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- no such relation
alter table nonesuch rename to newnonesuch;
ERROR: Relation 'nonesuch' does not exist
@ -144,7 +144,7 @@ ERROR: AggregateCreate: transition function 2 MUST have an initial value
-- missing index name
drop index;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- bad index name
drop index 314159;
ERROR: parser: parse error at or near "314159"
@ -156,16 +156,16 @@ ERROR: index "nonesuch" nonexistent
-- missing aggregate name
drop aggregate;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- bad aggregate name
drop aggregate 314159;
ERROR: parser: parse error at or near "314159"
-- no such aggregate
drop aggregate nonesuch;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- missing aggregate type
drop aggregate newcnt1;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- bad aggregate type
drop aggregate newcnt nonesuch;
ERROR: RemoveAggregate: type 'nonesuch' does not exist
@ -189,7 +189,7 @@ ERROR: RemoveFunction: function 'nonesuch()' does not exist
-- missing type name
drop type;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- bad type name
drop type 314159;
ERROR: parser: parse error at or near "314159"
@ -201,13 +201,13 @@ ERROR: RemoveType: type 'nonesuch' does not exist
-- missing everything
drop operator;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- bad operator name
drop operator equals;
ERROR: parser: parse error at or near "equals"
-- missing type list
drop operator ===;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- missing parentheses
drop operator int4, int4;
ERROR: parser: parse error at or near "int4"
@ -243,7 +243,7 @@ ERROR: parser: parse error at or near ")"
-- missing rule name
drop rule;
ERROR: parser: parse error at or near ""
ERROR: parser: parse error at or near ";"
-- bad rule name
drop rule 314159;
ERROR: parser: parse error at or near "314159"

View File

@ -149,7 +149,19 @@ SELECT '' AS five, f.f1, f.f1 % AS round_f1
| 1.2345678901234e-200 | 0
(5 rows)
SELECT sqrt(float8 '64') AS eight;
eight
-------
8
(1 row)
-- square root
SELECT |/ float8 '64' AS eight;
eight
-------
8
(1 row)
SELECT '' AS three, f.f1, |/f.f1 AS sqrt_f1
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
@ -172,6 +184,12 @@ SELECT '' AS three, f.f1, : ( ; f.f1) AS exp_ln_f1
(3 rows)
-- cube root
SELECT ||/ float8 '27' AS three;
three
-------
3
(1 row)
SELECT '' AS five, f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
five | f1 | cbrt_f1
------+----------------------+----------------------
@ -217,7 +235,7 @@ SELECT '' AS five, FLOAT8_TBL.*;
| -1.2345678901234e-200
(5 rows)
-- test for over and under flow
-- test for over- and underflow
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
ERROR: Input '10e400' is out of range for float8
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');

View File

@ -150,11 +150,11 @@ SELECT '' as six, box(f1) AS box FROM CIRCLE_TBL;
six | box
-----+----------------------------------------------------------------------------
| (2.12132034355964,2.12132034355964),(-2.12132034355964,-2.12132034355964)
| (71.7106781186547,72.7106781186547),(-69.7106781186547,-68.7106781186547)
| (4.53553390593274,6.53553390593274),(-2.53553390593274,-0.535533905932737)
| (71.7106781186548,72.7106781186548),(-69.7106781186548,-68.7106781186548)
| (4.53553390593274,6.53553390593274),(-2.53553390593274,-0.535533905932738)
| (3.12132034355964,4.12132034355964),(-1.12132034355964,-0.121320343559642)
| (107.071067811865,207.071067811865),(92.9289321881345,192.928932188135)
| (170.710678118655,70.7106781186547),(29.2893218813453,-70.7106781186547)
| (170.710678118655,70.7106781186548),(29.2893218813452,-70.7106781186548)
(6 rows)
-- translation
@ -280,7 +280,7 @@ SELECT '' AS twenty, b.f1 / p.f1 AS rotation
-- Paths
--
SET geqo TO 'off';
SELECT '' AS eight, points(f1) AS npoints, f1 AS path FROM PATH_TBL;
SELECT '' AS eight, npoints(f1) AS npoints, f1 AS path FROM PATH_TBL;
eight | npoints | path
-------+---------+---------------------------
| 2 | [(1,2),(3,4)]
@ -397,7 +397,7 @@ SELECT '' AS twentyfour, p.f1, poly.f1, p.f1 @ poly.f1 AS contained
| (10,10) | ((0,1),(0,1)) | f
(24 rows)
SELECT '' AS four, points(f1) AS npoints, f1 AS polygon
SELECT '' AS four, npoints(f1) AS npoints, f1 AS polygon
FROM POLYGON_TBL;
four | npoints | polygon
------+---------+---------------------
@ -502,31 +502,31 @@ SELECT '' AS twentyfour, c1.f1 AS circle, p1.f1 AS point, (p1.f1 <-> c1.f1) AS d
FROM CIRCLE_TBL c1, POINT_TBL p1
WHERE (p1.f1 <-> c1.f1) > 0
ORDER BY distance, circle, point using <<;
twentyfour | circle | point | distance
------------+----------------+------------+------------------
| <(100,0),100> | (5.1,34.5) | 0.97653192697797
| <(1,2),3> | (-3,4) | 1.47213595499958
| <(0,0),3> | (-3,4) | 2
| <(100,0),100> | (-3,4) | 3.07764064044152
| <(100,0),100> | (-5,-12) | 5.68348972285122
| <(1,3),5> | (-10,0) | 6.40175425099138
| <(1,3),5> | (10,10) | 6.40175425099138
| <(0,0),3> | (-10,0) | 7
| <(1,2),3> | (-10,0) | 8.18033988749895
| <(1,2),3> | (10,10) | 9.0415945787923
| <(0,0),3> | (-5,-12) | 10
| <(100,0),100> | (-10,0) | 10
| <(0,0),3> | (10,10) | 11.142135623731
| <(1,3),5> | (-5,-12) | 11.1554944214035
| <(1,2),3> | (-5,-12) | 12.2315462117278
| <(1,3),5> | (5.1,34.5) | 26.7657047773223
| <(1,2),3> | (5.1,34.5) | 29.757594539282
| <(0,0),3> | (5.1,34.5) | 31.8749193547455
| <(100,200),10> | (5.1,34.5) | 180.778038568384
| <(100,200),10> | (10,10) | 200.237960416286
| <(100,200),10> | (-3,4) | 211.415898254845
| <(100,200),10> | (0,0) | 213.606797749979
| <(100,200),10> | (-10,0) | 218.254244210267
| <(100,200),10> | (-5,-12) | 226.577682802077
twentyfour | circle | point | distance
------------+----------------+------------+-------------------
| <(100,0),100> | (5.1,34.5) | 0.976531926977965
| <(1,2),3> | (-3,4) | 1.47213595499958
| <(0,0),3> | (-3,4) | 2
| <(100,0),100> | (-3,4) | 3.07764064044151
| <(100,0),100> | (-5,-12) | 5.68348972285122
| <(1,3),5> | (-10,0) | 6.40175425099138
| <(1,3),5> | (10,10) | 6.40175425099138
| <(0,0),3> | (-10,0) | 7
| <(1,2),3> | (-10,0) | 8.18033988749895
| <(1,2),3> | (10,10) | 9.0415945787923
| <(0,0),3> | (-5,-12) | 10
| <(100,0),100> | (-10,0) | 10
| <(0,0),3> | (10,10) | 11.142135623731
| <(1,3),5> | (-5,-12) | 11.1554944214035
| <(1,2),3> | (-5,-12) | 12.2315462117278
| <(1,3),5> | (5.1,34.5) | 26.7657047773223
| <(1,2),3> | (5.1,34.5) | 29.757594539282
| <(0,0),3> | (5.1,34.5) | 31.8749193547455
| <(100,200),10> | (5.1,34.5) | 180.778038568384
| <(100,200),10> | (10,10) | 200.237960416286
| <(100,200),10> | (-3,4) | 211.415898254845
| <(100,200),10> | (0,0) | 213.606797749979
| <(100,200),10> | (-10,0) | 218.254244210267
| <(100,200),10> | (-5,-12) | 226.577682802077
(24 rows)

View File

@ -295,21 +295,3 @@ SELECT (2 + 2) / 2 AS two;
2
(1 row)
SELECT dsqrt(float8 '64') AS eight;
eight
-------
8
(1 row)
SELECT |/float8 '64' AS eight;
eight
-------
8
(1 row)
SELECT ||/float8 '27' AS three;
three
-------
3
(1 row)

View File

@ -646,10 +646,10 @@ SELECT t1.id1, t1.result, t2.expected
(0 rows)
-- ******************************
-- * POWER(10, LN(value)) check
-- * POW(10, LN(value)) check
-- ******************************
DELETE FROM num_result;
INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200))))
INSERT INTO num_result SELECT id, 0, POW(numeric '10', LN(ABS(round(val,200))))
FROM num_data
WHERE val != '0.0';
SELECT t1.id1, t1.result, t2.expected

View File

@ -1147,27 +1147,27 @@ SELECT * FROM shoelace ORDER BY sl_name;
-- Check that ruleutils are working
--
SELECT viewname, definition FROM pg_views ORDER BY viewname;
viewname | definition
--------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih (name, thepath), ramp r (name, thepath) WHERE (ih.thepath ## r.thepath);
pg_indexes | SELECT c.relname AS tablename, i.relname AS indexname, pg_get_indexdef(x.indexrelid) AS indexdef FROM pg_index x (indexrelid, indrelid, indproc, indkey, indclass, indisclustered, indislossy, indhaskeytype, indisunique, indisprimary, indreference, indpred), pg_class c (relname, reltype, relowner, relam, relpages, reltuples, rellongrelid, relhasindex, relisshared, relkind, relnatts, relchecks, reltriggers, relukeys, relfkeys, relrefs, relhaspkey, relhasrules, relacl), pg_class i (relname, reltype, relowner, relam, relpages, reltuples, rellongrelid, relhasindex, relisshared, relkind, relnatts, relchecks, reltriggers, relukeys, relfkeys, relrefs, relhaspkey, relhasrules, relacl) WHERE ((c.oid = x.indrelid) AND (i.oid = x.indexrelid));
pg_rules | SELECT c.relname AS tablename, r.rulename, pg_get_ruledef(r.rulename) AS definition FROM pg_rewrite r (rulename, ev_type, ev_class, ev_attr, is_instead, ev_qual, ev_action), pg_class c (relname, reltype, relowner, relam, relpages, reltuples, rellongrelid, relhasindex, relisshared, relkind, relnatts, relchecks, reltriggers, relukeys, relfkeys, relrefs, relhaspkey, relhasrules, relacl) WHERE ((r.rulename !~ '^_RET'::text) AND (c.oid = r.ev_class));
pg_tables | SELECT c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, c.relhasindex AS hasindexes, c.relhasrules AS hasrules, (c.reltriggers > 0) AS hastriggers FROM pg_class c (relname, reltype, relowner, relam, relpages, reltuples, rellongrelid, relhasindex, relisshared, relkind, relnatts, relchecks, reltriggers, relukeys, relfkeys, relrefs, relhaspkey, relhasrules, relacl) WHERE (((c.relkind = 'r'::"char") OR (c.relkind = 's'::"char")) AND (NOT (EXISTS (SELECT pg_rewrite.rulename FROM pg_rewrite WHERE ((pg_rewrite.ev_class = c.oid) AND (pg_rewrite.ev_type = '1'::"char"))))));
viewname | definition
--------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r WHERE (ih.thepath ## r.thepath);
pg_indexes | SELECT c.relname AS tablename, i.relname AS indexname, pg_get_indexdef(x.indexrelid) AS indexdef FROM pg_index x, pg_class c, pg_class i WHERE ((c.oid = x.indrelid) AND (i.oid = x.indexrelid));
pg_rules | SELECT c.relname AS tablename, r.rulename, pg_get_ruledef(r.rulename) AS definition FROM pg_rewrite r, pg_class c WHERE ((r.rulename !~ '^_RET'::text) AND (c.oid = r.ev_class));
pg_tables | SELECT c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, c.relhasindex AS hasindexes, c.relhasrules AS hasrules, (c.reltriggers > 0) AS hastriggers FROM pg_class c WHERE (((c.relkind = 'r'::"char") OR (c.relkind = 's'::"char")) AND (NOT (EXISTS (SELECT pg_rewrite.rulename FROM pg_rewrite WHERE ((pg_rewrite.ev_class = c.oid) AND (pg_rewrite.ev_type = '1'::"char"))))));
pg_user | SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb, pg_shadow.usetrace, pg_shadow.usesuper, pg_shadow.usecatupd, '********'::text AS passwd, pg_shadow.valuntil FROM pg_shadow;
pg_views | SELECT c.relname AS viewname, pg_get_userbyid(c.relowner) AS viewowner, pg_get_viewdef(c.relname) AS definition FROM pg_class c (relname, reltype, relowner, relam, relpages, reltuples, rellongrelid, relhasindex, relisshared, relkind, relnatts, relchecks, reltriggers, relukeys, relfkeys, relrefs, relhaspkey, relhasrules, relacl) WHERE (c.relhasrules AND (EXISTS (SELECT r.rulename FROM pg_rewrite r (rulename, ev_type, ev_class, ev_attr, is_instead, ev_qual, ev_action) WHERE ((r.ev_class = c.oid) AND (r.ev_type = '1'::"char")))));
pg_views | SELECT c.relname AS viewname, pg_get_userbyid(c.relowner) AS viewowner, pg_get_viewdef(c.relname) AS definition FROM pg_class c WHERE (c.relhasrules AND (EXISTS (SELECT r.rulename FROM pg_rewrite r WHERE ((r.ev_class = c.oid) AND (r.ev_type = '1'::"char")))));
rtest_v1 | SELECT rtest_t1.a, rtest_t1.b FROM rtest_t1;
rtest_vcomp | SELECT x.part, (x.size * y.factor) AS size_in_cm FROM rtest_comp x (part, unit, size), rtest_unitfact y (unit, factor) WHERE (x.unit = y.unit);
rtest_vview1 | SELECT x.a, x.b FROM rtest_view1 x (a, b, v) WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y (a) WHERE (y.a = x.a)));
rtest_vcomp | SELECT x.part, (x.size * y.factor) AS size_in_cm FROM rtest_comp x, rtest_unitfact y WHERE (x.unit = y.unit);
rtest_vview1 | SELECT x.a, x.b FROM rtest_view1 x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y WHERE (y.a = x.a)));
rtest_vview2 | SELECT rtest_view1.a, rtest_view1.b FROM rtest_view1 WHERE rtest_view1.v;
rtest_vview3 | SELECT x.a, x.b FROM rtest_vview2 x (a, b) WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y (a) WHERE (y.a = x.a)));
rtest_vview4 | SELECT x.a, x.b, count(y.a) AS refcount FROM rtest_view1 x (a, b, v), rtest_view2 y (a) WHERE (x.a = y.a) GROUP BY x.a, x.b;
rtest_vview3 | SELECT x.a, x.b FROM rtest_vview2 x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y WHERE (y.a = x.a)));
rtest_vview4 | SELECT x.a, x.b, count(y.a) AS refcount FROM rtest_view1 x, rtest_view2 y WHERE (x.a = y.a) GROUP BY x.a, x.b;
rtest_vview5 | SELECT rtest_view1.a, rtest_view1.b, rtest_viewfunc1(rtest_view1.a) AS refcount FROM rtest_view1;
shoe | SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit FROM shoe_data sh (shoename, sh_avail, slcolor, slminlen, slmaxlen, slunit), unit un (un_name, un_fact) WHERE (sh.slunit = un.un_name);
shoe_ready | SELECT rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail FROM shoe rsh (shoename, sh_avail, slcolor, slminlen, slminlen_cm, slmaxlen, slmaxlen_cm, slunit), shoelace rsl (sl_name, sl_avail, sl_color, sl_len, sl_unit, sl_len_cm) WHERE (((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >= rsh.slminlen_cm)) AND (rsl.sl_len_cm <= rsh.slmaxlen_cm));
shoelace | SELECT s.sl_name, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, (s.sl_len * u.un_fact) AS sl_len_cm FROM shoelace_data s (sl_name, sl_avail, sl_color, sl_len, sl_unit), unit u (un_name, un_fact) WHERE (s.sl_unit = u.un_name);
shoe | SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit FROM shoe_data sh, unit un WHERE (sh.slunit = un.un_name);
shoe_ready | SELECT rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail FROM shoe rsh, shoelace rsl WHERE (((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >= rsh.slminlen_cm)) AND (rsl.sl_len_cm <= rsh.slmaxlen_cm));
shoelace | SELECT s.sl_name, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, (s.sl_len * u.un_fact) AS sl_len_cm FROM shoelace_data s, unit u WHERE (s.sl_unit = u.un_name);
shoelace_candelete | SELECT shoelace_obsolete.sl_name, shoelace_obsolete.sl_avail, shoelace_obsolete.sl_color, shoelace_obsolete.sl_len, shoelace_obsolete.sl_unit, shoelace_obsolete.sl_len_cm FROM shoelace_obsolete WHERE (shoelace_obsolete.sl_avail = 0);
shoelace_obsolete | SELECT shoelace.sl_name, shoelace.sl_avail, shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm FROM shoelace WHERE (NOT (EXISTS (SELECT shoe.shoename FROM shoe WHERE (shoe.slcolor = shoelace.sl_color))));
street | SELECT r.name, r.thepath, c.cname FROM road r (name, thepath), real_city c (pop, cname, outline) WHERE (c.outline ## r.thepath);
street | SELECT r.name, r.thepath, c.cname FROM road r, real_city c WHERE (c.outline ## r.thepath);
toyemp | SELECT emp.name, emp.age, emp."location", (12 * emp.salary) AS annualsal FROM emp;
(20 rows)

View File

@ -3,7 +3,7 @@
--
-- Shorthand values
-- Not directly usable for regression testing since these are not constants.
-- So, just try to test parser and hope for the best - tgl 97/04/26
-- So, just try to test parser and hope for the best - thomas 97/04/26
SELECT (timestamp 'today' = (timestamp 'yesterday' + interval '1 day')) as "True";
True
------
@ -34,13 +34,25 @@ SELECT (timestamp 'now' - 'current') AS "ZeroSecs";
@ 0
(1 row)
SET DateStyle = 'Postgres,noneuropean';
SELECT timestamp('1994-01-01', '11:00') AS "Jan_01_1994_11am";
SET DateStyle = 'Postgres,NonEuropean';
SELECT timestamp(date '1994-01-01', time '11:00') AS "Jan_01_1994_11am";
Jan_01_1994_11am
------------------------------
Sat Jan 01 11:00:00 1994 PST
(1 row)
SELECT timestamp(date '1994-01-01', time '10:00') AS "Jan_01_1994_10am";
Jan_01_1994_10am
------------------------------
Sat Jan 01 10:00:00 1994 PST
(1 row)
SELECT timestamp(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am";
Jan_01_1994_8am
------------------------------
Sat Jan 01 08:00:00 1994 PST
(1 row)
CREATE TABLE TIMESTAMP_TBL ( d1 timestamp);
INSERT INTO TIMESTAMP_TBL VALUES ('current');
INSERT INTO TIMESTAMP_TBL VALUES ('today');

View File

@ -1,8 +1,7 @@
#!/bin/sh
# $Header: /cvsroot/pgsql/src/test/regress/Attic/regress.sh,v 1.43 2000/03/01 21:10:04 petere Exp $
# $Header: /cvsroot/pgsql/src/test/regress/Attic/regress.sh,v 1.44 2000/03/14 23:06:55 thomas Exp $
#
if [ $# -eq 0 ]
then
if [ $# -eq 0 ]; then
echo "Syntax: $0 <hostname> [extra-tests]"
exit 1
fi
@ -11,8 +10,7 @@ hostname=$1
shift
extratests="$*"
if [ "x$hostname" = "xwin" -o "x$hostname" = "xi386-pc-qnx4" ]
then
if [ "x$hostname" = "xwin" -o "x$hostname" = "xi386-pc-qnx4" ]; then
HOSTLOC="-h localhost"
else
HOSTLOC=""
@ -81,21 +79,22 @@ if [ $? -ne 0 ]; then
exit 1
fi
if [ "x$hostname" != "xi386-pc-qnx4" ]
then
echo "=============== installing PL/pgSQL... ================="
if [ "x$hostname" != "xi386-pc-qnx4" ]; then
echo "=============== installing languages... ================="
$ECHO_N "installing PL/pgSQL .. " $ECHO_C
createlang $HOSTLOC plpgsql regression
if [ $? -ne 0 -a $? -ne 2 ]; then
echo createlang failed
echo failed
exit 1
else
echo ok
fi
fi
echo "=============== running regression queries... ================="
echo "" > regression.diffs
if [ "x$hostname" = "xi386-pc-qnx4" ]
then
if [ "x$hostname" = "xi386-pc-qnx4" ]; then
DIFFOPT="-b"
else
DIFFOPT="-w"
@ -126,8 +125,7 @@ do
fi
done
if [ `diff ${DIFFOPT} ${EXPECTED} results/${tst}.out | wc -l` -ne 0 ]
then
if [ `diff ${DIFFOPT} ${EXPECTED} results/${tst}.out | wc -l` -ne 0 ]; then
( diff ${DIFFOPT} -C3 ${EXPECTED} results/${tst}.out; \
echo ""; \
echo "----------------------"; \
@ -147,24 +145,23 @@ $FRONTEND regression < errors.sql
#set this to 1 to avoid clearing the database
debug=0
if test "$debug" -eq 1
then
echo Skipping clearing and deletion of the regression database
if [ test "$debug" -eq 1 ]; then
echo Skipping clearing and deletion of the regression database
else
echo "=============== clearing regression database... ================="
$FRONTEND regression < drop.sql
if [ $? -ne 0 ]; then
echo the drop script has an error
exit 1
fi
echo "=============== clearing regression database... ================="
$FRONTEND regression < drop.sql
if [ $? -ne 0 ]; then
echo the drop script has an error
exit 1
fi
exit 0
echo "=============== dropping regression database... ================="
dropdb regression
if [ $? -ne 0 ]; then
echo dropdb failed
exit 1
fi
exit 0
echo "=============== dropping regression database... ================="
dropdb regression
if [ $? -ne 0 ]; then
echo dropdb failed
exit 1
fi
exit 0
exit 0
fi

View File

@ -189,7 +189,7 @@ DELETE FROM tmp3 where a=5;
-- Try (and succeed)
ALTER TABLE tmp3 add constraint tmpconstr foreign key (a) references tmp2 match full;
DROP TABLE tmp3
DROP TABLE tmp3;
DROP TABLE tmp2
DROP TABLE tmp2;

View File

@ -39,7 +39,7 @@ INSERT INTO BOX_TBL (f1) VALUES ('asdfasdf(ad');
SELECT '' AS four, BOX_TBL.*;
SELECT '' AS four, b.*, box_area(b.f1) as barea
SELECT '' AS four, b.*, area(b.f1) as barea
FROM BOX_TBL b;
-- overlap

View File

@ -60,7 +60,11 @@ SELECT '' AS five, f.f1, %f.f1 AS trunc_f1
SELECT '' AS five, f.f1, f.f1 % AS round_f1
FROM FLOAT8_TBL f;
SELECT sqrt(float8 '64') AS eight;
-- square root
SELECT |/ float8 '64' AS eight;
SELECT '' AS three, f.f1, |/f.f1 AS sqrt_f1
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
@ -71,6 +75,8 @@ SELECT '' AS three, f.f1, : ( ; f.f1) AS exp_ln_f1
WHERE f.f1 > '0.0';
-- cube root
SELECT ||/ float8 '27' AS three;
SELECT '' AS five, f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
@ -94,7 +100,7 @@ SELECT '' AS bad, f.f1 / '0.0' from FLOAT8_TBL f;
SELECT '' AS five, FLOAT8_TBL.*;
-- test for over and under flow
-- test for over- and underflow
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');

View File

@ -85,7 +85,7 @@ SELECT '' AS twenty, b.f1 / p.f1 AS rotation
SET geqo TO 'off';
SELECT '' AS eight, points(f1) AS npoints, f1 AS path FROM PATH_TBL;
SELECT '' AS eight, npoints(f1) AS npoints, f1 AS path FROM PATH_TBL;
SELECT '' AS four, path(f1) FROM POLYGON_TBL;
@ -110,7 +110,7 @@ SELECT '' AS twentyfour, p.f1, poly.f1, poly.f1 ~ p.f1 AS contains
SELECT '' AS twentyfour, p.f1, poly.f1, p.f1 @ poly.f1 AS contained
FROM POLYGON_TBL poly, POINT_TBL p;
SELECT '' AS four, points(f1) AS npoints, f1 AS polygon
SELECT '' AS four, npoints(f1) AS npoints, f1 AS polygon
FROM POLYGON_TBL;
SELECT '' AS four, polygon(f1)

View File

@ -103,10 +103,3 @@ SELECT 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 AS ten;
SELECT 2 + 2 / 2 AS three;
SELECT (2 + 2) / 2 AS two;
SELECT dsqrt(float8 '64') AS eight;
SELECT |/float8 '64' AS eight;
SELECT ||/float8 '27' AS three;

View File

@ -623,10 +623,10 @@ SELECT t1.id1, t1.result, t2.expected
AND t1.result != t2.expected;
-- ******************************
-- * POWER(10, LN(value)) check
-- * POW(10, LN(value)) check
-- ******************************
DELETE FROM num_result;
INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200))))
INSERT INTO num_result SELECT id, 0, POW(numeric '10', LN(ABS(round(val,200))))
FROM num_data
WHERE val != '0.0';
SELECT t1.id1, t1.result, t2.expected

View File

@ -4,7 +4,7 @@
-- Shorthand values
-- Not directly usable for regression testing since these are not constants.
-- So, just try to test parser and hope for the best - tgl 97/04/26
-- So, just try to test parser and hope for the best - thomas 97/04/26
SELECT (timestamp 'today' = (timestamp 'yesterday' + interval '1 day')) as "True";
SELECT (timestamp 'today' = (timestamp 'tomorrow' - interval '1 day')) as "True";
@ -12,8 +12,10 @@ SELECT (timestamp 'tomorrow' = (timestamp 'yesterday' + interval '2 days')) as "
SELECT (timestamp 'current' = 'now') as "True";
SELECT (timestamp 'now' - 'current') AS "ZeroSecs";
SET DateStyle = 'Postgres,noneuropean';
SELECT timestamp('1994-01-01', '11:00') AS "Jan_01_1994_11am";
SET DateStyle = 'Postgres,NonEuropean';
SELECT timestamp(date '1994-01-01', time '11:00') AS "Jan_01_1994_11am";
SELECT timestamp(date '1994-01-01', time '10:00') AS "Jan_01_1994_10am";
SELECT timestamp(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am";
CREATE TABLE TIMESTAMP_TBL ( d1 timestamp);