mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
DROP AGGREGATE and COMMENT ON AGGREGATE now accept the expected syntax
'aggname (aggtype)'. The old syntax 'aggname aggtype' is still accepted for backwards compatibility. Fix pg_dump, which was actually broken for most cases of user-defined aggregates. Clean up error messages associated with these commands.
This commit is contained in:
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$Header: /cvsroot/pgsql/doc/src/sgml/ref/comment.sgml,v 1.9 2001/09/03 12:57:49 petere Exp $
|
$Header: /cvsroot/pgsql/doc/src/sgml/ref/comment.sgml,v 1.10 2001/10/03 20:54:20 tgl Exp $
|
||||||
Postgres documentation
|
Postgres documentation
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@ -25,11 +25,10 @@ Postgres documentation
|
|||||||
<synopsis>
|
<synopsis>
|
||||||
COMMENT ON
|
COMMENT ON
|
||||||
[
|
[
|
||||||
[ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ]
|
[ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ] <replaceable class="PARAMETER">object_name</replaceable> |
|
||||||
<replaceable class="PARAMETER">object_name</replaceable> |
|
COLUMN <replaceable class="PARAMETER">table_name</replaceable>.<replaceable class="PARAMETER">column_name</replaceable> |
|
||||||
COLUMN <replaceable class="PARAMETER">table_name</replaceable>.<replaceable class="PARAMETER">column_name</replaceable>|
|
AGGREGATE <replaceable class="PARAMETER">agg_name</replaceable> (<replaceable class="PARAMETER">agg_type</replaceable>) |
|
||||||
AGGREGATE <replaceable class="PARAMETER">agg_name</replaceable> <replaceable class="PARAMETER">agg_type</replaceable>|
|
FUNCTION <replaceable class="PARAMETER">func_name</replaceable> (<replaceable class="PARAMETER">arg1</replaceable>, <replaceable class="PARAMETER">arg2</replaceable>, ...) |
|
||||||
FUNCTION <replaceable class="PARAMETER">func_name</replaceable> (<replaceable class="PARAMETER">arg1</replaceable>, <replaceable class="PARAMETER">arg2</replaceable>, ...)|
|
|
||||||
OPERATOR <replaceable class="PARAMETER">op</replaceable> (<replaceable class="PARAMETER">leftoperand_type</replaceable> <replaceable class="PARAMETER">rightoperand_type</replaceable>) |
|
OPERATOR <replaceable class="PARAMETER">op</replaceable> (<replaceable class="PARAMETER">leftoperand_type</replaceable> <replaceable class="PARAMETER">rightoperand_type</replaceable>) |
|
||||||
TRIGGER <replaceable class="PARAMETER">trigger_name</replaceable> ON <replaceable class="PARAMETER">table_name</replaceable>
|
TRIGGER <replaceable class="PARAMETER">trigger_name</replaceable> ON <replaceable class="PARAMETER">table_name</replaceable>
|
||||||
] IS <replaceable class="PARAMETER">'text'</replaceable>
|
] IS <replaceable class="PARAMETER">'text'</replaceable>
|
||||||
@ -102,7 +101,7 @@ COMMENT
|
|||||||
<command>COMMENT</command> adds a comment to an object that can be
|
<command>COMMENT</command> adds a comment to an object that can be
|
||||||
easily retrieved with <command>psql</command>'s
|
easily retrieved with <command>psql</command>'s
|
||||||
<command>\dd</command>, <command>\d+</command>, or <command>\l+</command> commands.
|
<command>\dd</command>, <command>\d+</command>, or <command>\l+</command> commands.
|
||||||
To remove a comment, use <literal>NULL</literal>.
|
To remove a comment, write <literal>NULL</literal>.
|
||||||
Comments are automatically dropped when the object is dropped.
|
Comments are automatically dropped when the object is dropped.
|
||||||
</para>
|
</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_aggregate.sgml,v 1.12 2001/09/03 12:57:49 petere Exp $
|
$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_aggregate.sgml,v 1.13 2001/10/03 20:54:20 tgl Exp $
|
||||||
Postgres documentation
|
Postgres documentation
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ Postgres documentation
|
|||||||
<date>1999-07-20</date>
|
<date>1999-07-20</date>
|
||||||
</refsynopsisdivinfo>
|
</refsynopsisdivinfo>
|
||||||
<synopsis>
|
<synopsis>
|
||||||
DROP AGGREGATE <replaceable class="PARAMETER">name</replaceable> <replaceable class="PARAMETER">type</replaceable>
|
DROP AGGREGATE <replaceable class="PARAMETER">name</replaceable> ( <replaceable class="PARAMETER">type</replaceable> )
|
||||||
</synopsis>
|
</synopsis>
|
||||||
|
|
||||||
<refsect2 id="R2-SQL-DROPAGGREGATE-1">
|
<refsect2 id="R2-SQL-DROPAGGREGATE-1">
|
||||||
@ -81,7 +81,7 @@ DROP
|
|||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><computeroutput>
|
<term><computeroutput>
|
||||||
ERROR: RemoveAggregate: aggregate '<replaceable class="parameter">agg</replaceable>' for '<replaceable class="parameter">name</replaceable>' does not exist
|
ERROR: RemoveAggregate: aggregate '<replaceable class="parameter">name</replaceable>' for type <replaceable class="parameter">type</replaceable> does not exist
|
||||||
</computeroutput></term>
|
</computeroutput></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
@ -133,7 +133,7 @@ ERROR: RemoveAggregate: aggregate '<replaceable class="parameter">agg</replaceab
|
|||||||
<literal>int4</literal>:
|
<literal>int4</literal>:
|
||||||
</para>
|
</para>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
DROP AGGREGATE myavg int4;
|
DROP AGGREGATE myavg(int4);
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Copyright (c) 1999-2001, PostgreSQL Global Development Group
|
* Copyright (c) 1999-2001, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/comment.c,v 1.32 2001/08/10 18:57:34 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/comment.c,v 1.33 2001/10/03 20:54:20 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -25,6 +25,7 @@
|
|||||||
#include "catalog/pg_type.h"
|
#include "catalog/pg_type.h"
|
||||||
#include "commands/comment.h"
|
#include "commands/comment.h"
|
||||||
#include "miscadmin.h"
|
#include "miscadmin.h"
|
||||||
|
#include "parser/parse_agg.h"
|
||||||
#include "parser/parse_expr.h"
|
#include "parser/parse_expr.h"
|
||||||
#include "parser/parse_func.h"
|
#include "parser/parse_func.h"
|
||||||
#include "parser/parse.h"
|
#include "parser/parse.h"
|
||||||
@ -568,7 +569,7 @@ static void
|
|||||||
CommentAggregate(char *aggregate, List *arguments, char *comment)
|
CommentAggregate(char *aggregate, List *arguments, char *comment)
|
||||||
{
|
{
|
||||||
TypeName *aggtype = (TypeName *) lfirst(arguments);
|
TypeName *aggtype = (TypeName *) lfirst(arguments);
|
||||||
char *aggtypename = NULL;
|
char *aggtypename;
|
||||||
Oid baseoid,
|
Oid baseoid,
|
||||||
oid;
|
oid;
|
||||||
Oid classoid;
|
Oid classoid;
|
||||||
@ -590,12 +591,12 @@ CommentAggregate(char *aggregate, List *arguments, char *comment)
|
|||||||
|
|
||||||
if (!pg_aggr_ownercheck(GetUserId(), aggregate, baseoid))
|
if (!pg_aggr_ownercheck(GetUserId(), aggregate, baseoid))
|
||||||
{
|
{
|
||||||
if (aggtypename)
|
if (baseoid == InvalidOid)
|
||||||
elog(ERROR, "you are not permitted to comment on aggregate '%s' with type '%s'",
|
elog(ERROR, "you are not permitted to comment on aggregate '%s' for all types",
|
||||||
aggregate, aggtypename);
|
|
||||||
else
|
|
||||||
elog(ERROR, "you are not permitted to comment on aggregate '%s'",
|
|
||||||
aggregate);
|
aggregate);
|
||||||
|
else
|
||||||
|
elog(ERROR, "you are not permitted to comment on aggregate '%s' for type %s",
|
||||||
|
aggregate, format_type_be(baseoid));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now, attempt to find the actual tuple in pg_aggregate */
|
/* Now, attempt to find the actual tuple in pg_aggregate */
|
||||||
@ -605,13 +606,7 @@ CommentAggregate(char *aggregate, List *arguments, char *comment)
|
|||||||
ObjectIdGetDatum(baseoid),
|
ObjectIdGetDatum(baseoid),
|
||||||
0, 0);
|
0, 0);
|
||||||
if (!OidIsValid(oid))
|
if (!OidIsValid(oid))
|
||||||
{
|
agg_error("CommentAggregate", aggregate, baseoid);
|
||||||
if (aggtypename)
|
|
||||||
elog(ERROR, "aggregate type '%s' does not exist for aggregate '%s'",
|
|
||||||
aggtypename, aggregate);
|
|
||||||
else
|
|
||||||
elog(ERROR, "aggregate '%s' does not exist", aggregate);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* pg_aggregate doesn't have a hard-coded OID, so must look it up */
|
/* pg_aggregate doesn't have a hard-coded OID, so must look it up */
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.62 2001/08/10 18:57:34 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.63 2001/10/03 20:54:20 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -22,9 +22,11 @@
|
|||||||
#include "commands/comment.h"
|
#include "commands/comment.h"
|
||||||
#include "commands/defrem.h"
|
#include "commands/defrem.h"
|
||||||
#include "miscadmin.h"
|
#include "miscadmin.h"
|
||||||
|
#include "parser/parse_agg.h"
|
||||||
#include "parser/parse_expr.h"
|
#include "parser/parse_expr.h"
|
||||||
#include "parser/parse_func.h"
|
#include "parser/parse_func.h"
|
||||||
#include "utils/acl.h"
|
#include "utils/acl.h"
|
||||||
|
#include "utils/builtins.h"
|
||||||
#include "utils/syscache.h"
|
#include "utils/syscache.h"
|
||||||
|
|
||||||
|
|
||||||
@ -354,7 +356,7 @@ RemoveAggregate(char *aggName, char *aggType)
|
|||||||
{
|
{
|
||||||
Relation relation;
|
Relation relation;
|
||||||
HeapTuple tup;
|
HeapTuple tup;
|
||||||
Oid basetypeID = InvalidOid;
|
Oid basetypeID;
|
||||||
bool defined;
|
bool defined;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -363,8 +365,7 @@ RemoveAggregate(char *aggName, char *aggType)
|
|||||||
*
|
*
|
||||||
* else if the basetype is blank, then attempt to find an aggregate with
|
* else if the basetype is blank, then attempt to find an aggregate with
|
||||||
* a basetype of zero. This is valid. It means that the aggregate is
|
* a basetype of zero. This is valid. It means that the aggregate is
|
||||||
* to apply to all basetypes. ie, a counter of some sort.
|
* to apply to all basetypes (eg, COUNT).
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (aggType)
|
if (aggType)
|
||||||
@ -374,20 +375,16 @@ RemoveAggregate(char *aggName, char *aggType)
|
|||||||
elog(ERROR, "RemoveAggregate: type '%s' does not exist", aggType);
|
elog(ERROR, "RemoveAggregate: type '%s' does not exist", aggType);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
basetypeID = 0;
|
basetypeID = InvalidOid;
|
||||||
|
|
||||||
if (!pg_aggr_ownercheck(GetUserId(), aggName, basetypeID))
|
if (!pg_aggr_ownercheck(GetUserId(), aggName, basetypeID))
|
||||||
{
|
{
|
||||||
if (aggType)
|
if (basetypeID == InvalidOid)
|
||||||
{
|
elog(ERROR, "RemoveAggregate: aggregate '%s' for all types: permission denied",
|
||||||
elog(ERROR, "RemoveAggregate: aggregate '%s' on type '%s': permission denied",
|
|
||||||
aggName, aggType);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elog(ERROR, "RemoveAggregate: aggregate '%s': permission denied",
|
|
||||||
aggName);
|
aggName);
|
||||||
}
|
else
|
||||||
|
elog(ERROR, "RemoveAggregate: aggregate '%s' for type %s: permission denied",
|
||||||
|
aggName, format_type_be(basetypeID));
|
||||||
}
|
}
|
||||||
|
|
||||||
relation = heap_openr(AggregateRelationName, RowExclusiveLock);
|
relation = heap_openr(AggregateRelationName, RowExclusiveLock);
|
||||||
@ -398,19 +395,7 @@ RemoveAggregate(char *aggName, char *aggType)
|
|||||||
0, 0);
|
0, 0);
|
||||||
|
|
||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
{
|
agg_error("RemoveAggregate", aggName, basetypeID);
|
||||||
heap_close(relation, RowExclusiveLock);
|
|
||||||
if (aggType)
|
|
||||||
{
|
|
||||||
elog(ERROR, "RemoveAggregate: aggregate '%s' for '%s' does not exist",
|
|
||||||
aggName, aggType);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elog(ERROR, "RemoveAggregate: aggregate '%s' for all types does not exist",
|
|
||||||
aggName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remove any comments related to this aggregate */
|
/* Remove any comments related to this aggregate */
|
||||||
DeleteComments(tup->t_data->t_oid, RelationGetRelid(relation));
|
DeleteComments(tup->t_data->t_oid, RelationGetRelid(relation));
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.199 2001/10/03 05:29:12 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.200 2001/10/03 20:54:20 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -2811,8 +2811,10 @@ transformTypeRefsList(ParseState *pstate, List *l)
|
|||||||
|
|
||||||
foreach(ele, l)
|
foreach(ele, l)
|
||||||
{
|
{
|
||||||
if (IsA(lfirst(ele), TypeName))
|
Node *elem = lfirst(ele);
|
||||||
transformTypeRef(pstate, (TypeName *) lfirst(ele));
|
|
||||||
|
if (elem && IsA(elem, TypeName))
|
||||||
|
transformTypeRef(pstate, (TypeName *) elem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.257 2001/10/03 05:29:12 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.258 2001/10/03 20:54:21 tgl Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
@ -217,8 +217,7 @@ static void doNegateFloat(Value *v);
|
|||||||
%type <boolean> opt_freeze, analyze_keyword
|
%type <boolean> opt_freeze, analyze_keyword
|
||||||
|
|
||||||
%type <ival> copy_dirn, direction, reindex_type, drop_type,
|
%type <ival> copy_dirn, direction, reindex_type, drop_type,
|
||||||
opt_column, event, comment_type, comment_cl,
|
opt_column, event, comment_type
|
||||||
comment_ag, comment_fn, comment_op, comment_tg
|
|
||||||
|
|
||||||
%type <ival> fetch_how_many
|
%type <ival> fetch_how_many
|
||||||
|
|
||||||
@ -2011,7 +2010,7 @@ TruncateStmt: TRUNCATE opt_table relation_name
|
|||||||
* the object associated with the comment. The form of the statement is:
|
* the object associated with the comment. The form of the statement is:
|
||||||
*
|
*
|
||||||
* COMMENT ON [ [ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ]
|
* COMMENT ON [ [ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ]
|
||||||
* <objname> | AGGREGATE <aggname> <aggtype> | FUNCTION
|
* <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION
|
||||||
* <funcname> (arg1, arg2, ...) | OPERATOR <op>
|
* <funcname> (arg1, arg2, ...) | OPERATOR <op>
|
||||||
* (leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON
|
* (leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON
|
||||||
* <relname> ] IS 'text'
|
* <relname> ] IS 'text'
|
||||||
@ -2028,50 +2027,61 @@ CommentStmt: COMMENT ON comment_type name IS comment_text
|
|||||||
n->comment = $6;
|
n->comment = $6;
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
| COMMENT ON comment_cl relation_name '.' attr_name IS comment_text
|
| COMMENT ON COLUMN relation_name '.' attr_name IS comment_text
|
||||||
{
|
{
|
||||||
CommentStmt *n = makeNode(CommentStmt);
|
CommentStmt *n = makeNode(CommentStmt);
|
||||||
n->objtype = $3;
|
n->objtype = COLUMN;
|
||||||
n->objname = $4;
|
n->objname = $4;
|
||||||
n->objproperty = $6;
|
n->objproperty = $6;
|
||||||
n->objlist = NULL;
|
n->objlist = NULL;
|
||||||
n->comment = $8;
|
n->comment = $8;
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
| COMMENT ON comment_ag name aggr_argtype IS comment_text
|
| COMMENT ON AGGREGATE name '(' aggr_argtype ')' IS comment_text
|
||||||
{
|
{
|
||||||
CommentStmt *n = makeNode(CommentStmt);
|
CommentStmt *n = makeNode(CommentStmt);
|
||||||
n->objtype = $3;
|
n->objtype = AGGREGATE;
|
||||||
|
n->objname = $4;
|
||||||
|
n->objproperty = NULL;
|
||||||
|
n->objlist = makeList1($6);
|
||||||
|
n->comment = $9;
|
||||||
|
$$ = (Node *) n;
|
||||||
|
}
|
||||||
|
| COMMENT ON AGGREGATE name aggr_argtype IS comment_text
|
||||||
|
{
|
||||||
|
/* Obsolete syntax, but must support for awhile */
|
||||||
|
CommentStmt *n = makeNode(CommentStmt);
|
||||||
|
n->objtype = AGGREGATE;
|
||||||
n->objname = $4;
|
n->objname = $4;
|
||||||
n->objproperty = NULL;
|
n->objproperty = NULL;
|
||||||
n->objlist = makeList1($5);
|
n->objlist = makeList1($5);
|
||||||
n->comment = $7;
|
n->comment = $7;
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
| COMMENT ON comment_fn func_name func_args IS comment_text
|
| COMMENT ON FUNCTION func_name func_args IS comment_text
|
||||||
{
|
{
|
||||||
CommentStmt *n = makeNode(CommentStmt);
|
CommentStmt *n = makeNode(CommentStmt);
|
||||||
n->objtype = $3;
|
n->objtype = FUNCTION;
|
||||||
n->objname = $4;
|
n->objname = $4;
|
||||||
n->objproperty = NULL;
|
n->objproperty = NULL;
|
||||||
n->objlist = $5;
|
n->objlist = $5;
|
||||||
n->comment = $7;
|
n->comment = $7;
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
| COMMENT ON comment_op all_Op '(' oper_argtypes ')' IS comment_text
|
| COMMENT ON OPERATOR all_Op '(' oper_argtypes ')' IS comment_text
|
||||||
{
|
{
|
||||||
CommentStmt *n = makeNode(CommentStmt);
|
CommentStmt *n = makeNode(CommentStmt);
|
||||||
n->objtype = $3;
|
n->objtype = OPERATOR;
|
||||||
n->objname = $4;
|
n->objname = $4;
|
||||||
n->objproperty = NULL;
|
n->objproperty = NULL;
|
||||||
n->objlist = $6;
|
n->objlist = $6;
|
||||||
n->comment = $9;
|
n->comment = $9;
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
| COMMENT ON comment_tg name ON relation_name IS comment_text
|
| COMMENT ON TRIGGER name ON relation_name IS comment_text
|
||||||
{
|
{
|
||||||
CommentStmt *n = makeNode(CommentStmt);
|
CommentStmt *n = makeNode(CommentStmt);
|
||||||
n->objtype = $3;
|
n->objtype = TRIGGER;
|
||||||
n->objname = $4;
|
n->objname = $4;
|
||||||
n->objproperty = $6;
|
n->objproperty = $6;
|
||||||
n->objlist = NULL;
|
n->objlist = NULL;
|
||||||
@ -2089,21 +2099,6 @@ comment_type: DATABASE { $$ = DATABASE; }
|
|||||||
| VIEW { $$ = VIEW; }
|
| VIEW { $$ = VIEW; }
|
||||||
;
|
;
|
||||||
|
|
||||||
comment_cl: COLUMN { $$ = COLUMN; }
|
|
||||||
;
|
|
||||||
|
|
||||||
comment_ag: AGGREGATE { $$ = AGGREGATE; }
|
|
||||||
;
|
|
||||||
|
|
||||||
comment_fn: FUNCTION { $$ = FUNCTION; }
|
|
||||||
;
|
|
||||||
|
|
||||||
comment_op: OPERATOR { $$ = OPERATOR; }
|
|
||||||
;
|
|
||||||
|
|
||||||
comment_tg: TRIGGER { $$ = TRIGGER; }
|
|
||||||
;
|
|
||||||
|
|
||||||
comment_text: Sconst { $$ = $1; }
|
comment_text: Sconst { $$ = $1; }
|
||||||
| NULL_P { $$ = NULL; }
|
| NULL_P { $$ = NULL; }
|
||||||
;
|
;
|
||||||
@ -2601,7 +2596,7 @@ func_type: Typename
|
|||||||
* QUERY:
|
* QUERY:
|
||||||
*
|
*
|
||||||
* DROP FUNCTION funcname (arg1, arg2, ...)
|
* DROP FUNCTION funcname (arg1, arg2, ...)
|
||||||
* DROP AGGREGATE aggname aggtype
|
* DROP AGGREGATE aggname (aggtype)
|
||||||
* DROP OPERATOR opname (leftoperand_typ rightoperand_typ)
|
* DROP OPERATOR opname (leftoperand_typ rightoperand_typ)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@ -2615,8 +2610,16 @@ RemoveFuncStmt: DROP FUNCTION func_name func_args
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
RemoveAggrStmt: DROP AGGREGATE func_name aggr_argtype
|
RemoveAggrStmt: DROP AGGREGATE func_name '(' aggr_argtype ')'
|
||||||
{
|
{
|
||||||
|
RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
|
||||||
|
n->aggname = $3;
|
||||||
|
n->aggtype = (Node *) $5;
|
||||||
|
$$ = (Node *)n;
|
||||||
|
}
|
||||||
|
| DROP AGGREGATE func_name aggr_argtype
|
||||||
|
{
|
||||||
|
/* Obsolete syntax, but must support for awhile */
|
||||||
RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
|
RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
|
||||||
n->aggname = $3;
|
n->aggname = $3;
|
||||||
n->aggtype = (Node *) $4;
|
n->aggtype = (Node *) $4;
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.57 2001/07/03 20:21:47 petere Exp $
|
* $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.58 2001/10/03 20:54:21 tgl Exp $
|
||||||
*
|
*
|
||||||
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
||||||
*
|
*
|
||||||
@ -56,7 +56,7 @@ static int strInArray(const char *pattern, char **arr, int arr_size);
|
|||||||
* findTypeByOid
|
* findTypeByOid
|
||||||
* given an oid of a type, return its typename
|
* given an oid of a type, return its typename
|
||||||
*
|
*
|
||||||
* if oid is "0", return "opaque" -- this is a special case
|
* Can return various special cases for oid 0.
|
||||||
*
|
*
|
||||||
* NOTE: should hash this, but just do linear search for now
|
* NOTE: should hash this, but just do linear search for now
|
||||||
*/
|
*/
|
||||||
@ -68,19 +68,12 @@ findTypeByOid(TypeInfo *tinfo, int numTypes, const char *oid, OidOptions opts)
|
|||||||
|
|
||||||
if (strcmp(oid, "0") == 0)
|
if (strcmp(oid, "0") == 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((opts & zeroAsOpaque) != 0)
|
if ((opts & zeroAsOpaque) != 0)
|
||||||
{
|
|
||||||
|
|
||||||
return g_opaque_type;
|
return g_opaque_type;
|
||||||
|
|
||||||
}
|
|
||||||
else if ((opts & zeroAsAny) != 0)
|
else if ((opts & zeroAsAny) != 0)
|
||||||
{
|
|
||||||
|
|
||||||
return "'any'";
|
return "'any'";
|
||||||
|
else if ((opts & zeroAsStar) != 0)
|
||||||
}
|
return "*";
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < numTypes; i++)
|
for (i = 0; i < numTypes; i++)
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.232 2001/10/03 05:23:12 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.233 2001/10/03 20:54:21 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -3706,7 +3706,9 @@ dumpAggs(Archive *fout, AggInfo *agginfo, int numAggs,
|
|||||||
|
|
||||||
resetPQExpBuffer(aggSig);
|
resetPQExpBuffer(aggSig);
|
||||||
appendPQExpBuffer(aggSig, "%s(%s)", agginfo[i].aggname,
|
appendPQExpBuffer(aggSig, "%s(%s)", agginfo[i].aggname,
|
||||||
findTypeByOid(tinfo, numTypes, agginfo[i].aggbasetype, zeroAsOpaque + useBaseTypeName));
|
findTypeByOid(tinfo, numTypes,
|
||||||
|
agginfo[i].aggbasetype,
|
||||||
|
zeroAsStar + useBaseTypeName));
|
||||||
|
|
||||||
if (!agginfo[i].convertok)
|
if (!agginfo[i].convertok)
|
||||||
{
|
{
|
||||||
@ -3721,7 +3723,8 @@ dumpAggs(Archive *fout, AggInfo *agginfo, int numAggs,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = findTypeByOid(tinfo, numTypes, agginfo[i].aggbasetype, zeroAsAny + useBaseTypeName);
|
name = findTypeByOid(tinfo, numTypes, agginfo[i].aggbasetype,
|
||||||
|
zeroAsAny + useBaseTypeName);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
{
|
{
|
||||||
write_msg(NULL, "WARNING: aggregate function \"%s\" (oid %s) not dumped\n",
|
write_msg(NULL, "WARNING: aggregate function \"%s\" (oid %s) not dumped\n",
|
||||||
@ -3738,7 +3741,8 @@ dumpAggs(Archive *fout, AggInfo *agginfo, int numAggs,
|
|||||||
}
|
}
|
||||||
appendPQExpBuffer(details, "BASETYPE = %s, ", name);
|
appendPQExpBuffer(details, "BASETYPE = %s, ", name);
|
||||||
|
|
||||||
name = findTypeByOid(tinfo, numTypes, agginfo[i].aggtranstype, zeroAsOpaque + useBaseTypeName);
|
name = findTypeByOid(tinfo, numTypes, agginfo[i].aggtranstype,
|
||||||
|
zeroAsOpaque + useBaseTypeName);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
{
|
{
|
||||||
write_msg(NULL, "WARNING: aggregate function \"%s\" (oid %s) not dumped\n",
|
write_msg(NULL, "WARNING: aggregate function \"%s\" (oid %s) not dumped\n",
|
||||||
@ -3781,8 +3785,7 @@ dumpAggs(Archive *fout, AggInfo *agginfo, int numAggs,
|
|||||||
/*** Dump Aggregate Comments ***/
|
/*** Dump Aggregate Comments ***/
|
||||||
|
|
||||||
resetPQExpBuffer(q);
|
resetPQExpBuffer(q);
|
||||||
appendPQExpBuffer(q, "AGGREGATE %s %s", agginfo[i].aggname,
|
appendPQExpBuffer(q, "AGGREGATE %s", aggSig->data);
|
||||||
findTypeByOid(tinfo, numTypes, agginfo[i].aggbasetype, zeroAsOpaque + useBaseTypeName));
|
|
||||||
dumpComment(fout, q->data, agginfo[i].oid, "pg_aggregate", 0, NULL);
|
dumpComment(fout, q->data, agginfo[i].oid, "pg_aggregate", 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: pg_dump.h,v 1.71 2001/10/01 21:31:52 tgl Exp $
|
* $Id: pg_dump.h,v 1.72 2001/10/03 20:54:21 tgl Exp $
|
||||||
*
|
*
|
||||||
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
||||||
*
|
*
|
||||||
@ -223,6 +223,7 @@ typedef enum _OidOptions
|
|||||||
{
|
{
|
||||||
zeroAsOpaque = 1,
|
zeroAsOpaque = 1,
|
||||||
zeroAsAny = 2,
|
zeroAsAny = 2,
|
||||||
|
zeroAsStar = 4,
|
||||||
useBaseTypeName = 1024
|
useBaseTypeName = 1024
|
||||||
} OidOptions;
|
} OidOptions;
|
||||||
|
|
||||||
|
@ -327,15 +327,15 @@ make_name(void)
|
|||||||
%type <str> createdb_opt_list opt_encoding OptInherit Geometric
|
%type <str> createdb_opt_list opt_encoding OptInherit Geometric
|
||||||
%type <str> DropdbStmt ClusterStmt grantee RevokeStmt Bit bit
|
%type <str> DropdbStmt ClusterStmt grantee RevokeStmt Bit bit
|
||||||
%type <str> GrantStmt privileges operation_commalist operation PosAllConst
|
%type <str> GrantStmt privileges operation_commalist operation PosAllConst
|
||||||
%type <str> opt_cursor ConstraintsSetStmt comment_tg AllConst
|
%type <str> opt_cursor ConstraintsSetStmt AllConst
|
||||||
%type <str> case_expr when_clause_list case_default case_arg when_clause
|
%type <str> case_expr when_clause_list case_default case_arg when_clause
|
||||||
%type <str> select_clause opt_select_limit select_limit_value ConstraintTimeSpec
|
%type <str> select_clause opt_select_limit select_limit_value ConstraintTimeSpec
|
||||||
%type <str> select_offset_value ReindexStmt join_type opt_boolean
|
%type <str> select_offset_value ReindexStmt join_type opt_boolean
|
||||||
%type <str> join_qual update_list AlterSchemaStmt joined_table
|
%type <str> join_qual update_list AlterSchemaStmt joined_table
|
||||||
%type <str> opt_level opt_lock lock_type OptGroupList OptGroupElem
|
%type <str> opt_level opt_lock lock_type OptGroupList OptGroupElem
|
||||||
%type <str> OptConstrFromTable comment_op OptTempTableName StringConst
|
%type <str> OptConstrFromTable OptTempTableName StringConst
|
||||||
%type <str> constraints_set_list constraints_set_namelist comment_fn
|
%type <str> constraints_set_list constraints_set_namelist
|
||||||
%type <str> constraints_set_mode comment_type comment_cl comment_ag
|
%type <str> constraints_set_mode comment_type
|
||||||
%type <str> CreateGroupStmt AlterGroupStmt DropGroupStmt key_delete
|
%type <str> CreateGroupStmt AlterGroupStmt DropGroupStmt key_delete
|
||||||
%type <str> opt_force key_update CreateSchemaStmt PosIntStringConst
|
%type <str> opt_force key_update CreateSchemaStmt PosIntStringConst
|
||||||
%type <str> IntConst PosIntConst grantee_list func_type opt_or_replace
|
%type <str> IntConst PosIntConst grantee_list func_type opt_or_replace
|
||||||
@ -1635,7 +1635,7 @@ from_in: IN { $$ = make_str("in"); }
|
|||||||
* the object associated with the comment. The form of the statement is:
|
* the object associated with the comment. The form of the statement is:
|
||||||
*
|
*
|
||||||
* COMMENT ON [ [ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ]
|
* COMMENT ON [ [ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ]
|
||||||
* <objname> | AGGREGATE <aggname> <aggtype> | FUNCTION
|
* <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION
|
||||||
* <funcname> (arg1, arg2, ...) | OPERATOR <op>
|
* <funcname> (arg1, arg2, ...) | OPERATOR <op>
|
||||||
* (leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON
|
* (leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON
|
||||||
* <relname> ] IS 'text'
|
* <relname> ] IS 'text'
|
||||||
@ -1645,25 +1645,29 @@ CommentStmt: COMMENT ON comment_type name IS comment_text
|
|||||||
{
|
{
|
||||||
$$ = cat_str(5, make_str("comment on"), $3, $4, make_str("is"), $6);
|
$$ = cat_str(5, make_str("comment on"), $3, $4, make_str("is"), $6);
|
||||||
}
|
}
|
||||||
| COMMENT ON comment_cl relation_name '.' attr_name IS comment_text
|
| COMMENT ON COLUMN relation_name '.' attr_name IS comment_text
|
||||||
{
|
{
|
||||||
$$ = cat_str(7, make_str("comment on"), $3, $4, make_str("."), $6, make_str("is"), $8);
|
$$ = cat_str(6, make_str("comment on column"), $4, make_str("."), $6, make_str("is"), $8);
|
||||||
}
|
}
|
||||||
| COMMENT ON comment_ag name aggr_argtype IS comment_text
|
| COMMENT ON AGGREGATE name '(' aggr_argtype ')' IS comment_text
|
||||||
{
|
{
|
||||||
$$ = cat_str(6, make_str("comment on"), $3, $4, $5, make_str("is"), $7);
|
$$ = cat_str(6, make_str("comment on aggregate"), $4, make_str("("), $6, make_str(") is"), $9);
|
||||||
}
|
}
|
||||||
| COMMENT ON comment_fn func_name func_args IS comment_text
|
| COMMENT ON AGGREGATE name aggr_argtype IS comment_text
|
||||||
{
|
|
||||||
$$ = cat_str(6, make_str("comment on"), $3, $4, $5, make_str("is"), $7);
|
|
||||||
}
|
|
||||||
| COMMENT ON comment_op all_Op '(' oper_argtypes ')' IS comment_text
|
|
||||||
{
|
|
||||||
$$ = cat_str(7, make_str("comment on"), $3, $4, make_str("("), $6, make_str(") is"), $9);
|
|
||||||
}
|
|
||||||
| COMMENT ON comment_tg name ON relation_name IS comment_text
|
|
||||||
{
|
{
|
||||||
$$ = cat_str(7, make_str("comment on"), $3, $4, make_str("on"), $6, make_str("is"), $8);
|
$$ = cat_str(5, make_str("comment on aggregate"), $4, $5, make_str("is"), $7);
|
||||||
|
}
|
||||||
|
| COMMENT ON FUNCTION func_name func_args IS comment_text
|
||||||
|
{
|
||||||
|
$$ = cat_str(5, make_str("comment on function"), $4, $5, make_str("is"), $7);
|
||||||
|
}
|
||||||
|
| COMMENT ON OPERATOR all_Op '(' oper_argtypes ')' IS comment_text
|
||||||
|
{
|
||||||
|
$$ = cat_str(6, make_str("comment on operator"), $4, make_str("("), $6, make_str(") is"), $9);
|
||||||
|
}
|
||||||
|
| COMMENT ON TRIGGER name ON relation_name IS comment_text
|
||||||
|
{
|
||||||
|
$$ = cat_str(6, make_str("comment on trigger"), $4, make_str("on"), $6, make_str("is"), $8);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -1676,16 +1680,6 @@ comment_type: DATABASE { $$ = make_str("database"); }
|
|||||||
| VIEW { $$ = make_str("view"); }
|
| VIEW { $$ = make_str("view"); }
|
||||||
;
|
;
|
||||||
|
|
||||||
comment_cl: COLUMN { $$ = make_str("column"); }
|
|
||||||
|
|
||||||
comment_ag: AGGREGATE { $$ = make_str("aggregate"); }
|
|
||||||
|
|
||||||
comment_fn: FUNCTION { $$ = make_str("function"); }
|
|
||||||
|
|
||||||
comment_op: OPERATOR { $$ = make_str("operator"); }
|
|
||||||
|
|
||||||
comment_tg: TRIGGER { $$ = make_str("trigger"); }
|
|
||||||
|
|
||||||
comment_text: StringConst { $$ = $1; }
|
comment_text: StringConst { $$ = $1; }
|
||||||
| NULL_P { $$ = make_str("null"); }
|
| NULL_P { $$ = make_str("null"); }
|
||||||
;
|
;
|
||||||
@ -1967,7 +1961,7 @@ func_type: Typename
|
|||||||
* QUERY:
|
* QUERY:
|
||||||
*
|
*
|
||||||
* DROP FUNCTION funcname (arg1, arg2, ...)
|
* DROP FUNCTION funcname (arg1, arg2, ...)
|
||||||
* DROP AGGREGATE aggname aggtype
|
* DROP AGGREGATE aggname (aggtype)
|
||||||
* DROP OPERATOR opname (leftoperand_typ rightoperand_typ)
|
* DROP OPERATOR opname (leftoperand_typ rightoperand_typ)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@ -1978,8 +1972,13 @@ RemoveFuncStmt: DROP FUNCTION func_name func_args
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
RemoveAggrStmt: DROP AGGREGATE func_name aggr_argtype
|
RemoveAggrStmt: DROP AGGREGATE func_name '(' aggr_argtype ')'
|
||||||
{
|
{
|
||||||
|
$$ = cat_str(5, make_str("drop aggregate"), $3, make_str("("), $5, make_str(")"));
|
||||||
|
}
|
||||||
|
| DROP AGGREGATE func_name aggr_argtype
|
||||||
|
{
|
||||||
|
/* Obsolete syntax, but must support for awhile */
|
||||||
$$ = cat_str(3, make_str("drop aggregate"), $3, $4);
|
$$ = cat_str(3, make_str("drop aggregate"), $3, $4);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -129,21 +129,21 @@ ERROR: index "nonesuch" does not exist
|
|||||||
-- missing aggregate name
|
-- missing aggregate name
|
||||||
drop aggregate;
|
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 ";"
|
|
||||||
-- missing aggregate type
|
-- missing aggregate type
|
||||||
drop aggregate newcnt1;
|
drop aggregate newcnt1;
|
||||||
ERROR: parser: parse error at or near ";"
|
ERROR: parser: parse error at or near ";"
|
||||||
|
-- bad aggregate name
|
||||||
|
drop aggregate 314159 (int);
|
||||||
|
ERROR: parser: parse error at or near "314159"
|
||||||
-- bad aggregate type
|
-- bad aggregate type
|
||||||
drop aggregate newcnt nonesuch;
|
drop aggregate newcnt (nonesuch);
|
||||||
ERROR: RemoveAggregate: type 'nonesuch' does not exist
|
ERROR: RemoveAggregate: type 'nonesuch' does not exist
|
||||||
|
-- no such aggregate
|
||||||
|
drop aggregate nonesuch (int4);
|
||||||
|
ERROR: RemoveAggregate: aggregate 'nonesuch' for type integer does not exist
|
||||||
-- no such aggregate for type
|
-- no such aggregate for type
|
||||||
drop aggregate newcnt float4;
|
drop aggregate newcnt (float4);
|
||||||
ERROR: RemoveAggregate: aggregate 'newcnt' for 'float4' does not exist
|
ERROR: RemoveAggregate: aggregate 'newcnt' for type real does not exist
|
||||||
--
|
--
|
||||||
-- REMOVE FUNCTION
|
-- REMOVE FUNCTION
|
||||||
|
|
||||||
|
@ -73,11 +73,11 @@ DROP TYPE widget;
|
|||||||
--
|
--
|
||||||
-- AGGREGATE REMOVAL
|
-- AGGREGATE REMOVAL
|
||||||
--
|
--
|
||||||
DROP AGGREGATE newavg int4;
|
DROP AGGREGATE newavg (int4);
|
||||||
|
|
||||||
DROP AGGREGATE newsum int4;
|
DROP AGGREGATE newsum (int4);
|
||||||
|
|
||||||
DROP AGGREGATE newcnt int4;
|
DROP AGGREGATE newcnt (int4);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
|
@ -147,20 +147,20 @@ drop index nonesuch;
|
|||||||
-- missing aggregate name
|
-- missing aggregate name
|
||||||
drop aggregate;
|
drop aggregate;
|
||||||
|
|
||||||
-- bad aggregate name
|
|
||||||
drop aggregate 314159;
|
|
||||||
|
|
||||||
-- no such aggregate
|
|
||||||
drop aggregate nonesuch;
|
|
||||||
|
|
||||||
-- missing aggregate type
|
-- missing aggregate type
|
||||||
drop aggregate newcnt1;
|
drop aggregate newcnt1;
|
||||||
|
|
||||||
|
-- bad aggregate name
|
||||||
|
drop aggregate 314159 (int);
|
||||||
|
|
||||||
-- bad aggregate type
|
-- bad aggregate type
|
||||||
drop aggregate newcnt nonesuch;
|
drop aggregate newcnt (nonesuch);
|
||||||
|
|
||||||
|
-- no such aggregate
|
||||||
|
drop aggregate nonesuch (int4);
|
||||||
|
|
||||||
-- no such aggregate for type
|
-- no such aggregate for type
|
||||||
drop aggregate newcnt float4;
|
drop aggregate newcnt (float4);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
--
|
--
|
||||||
-- Copyright (c) 1994, Regents of the University of California
|
-- Copyright (c) 1994, Regents of the University of California
|
||||||
--
|
--
|
||||||
-- $Id: complex.source,v 1.9 2001/08/21 16:36:06 tgl Exp $
|
-- $Id: complex.source,v 1.10 2001/10/03 20:54:22 tgl Exp $
|
||||||
--
|
--
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -285,6 +285,6 @@ DROP OPERATOR <= (complex, complex);
|
|||||||
DROP OPERATOR = (complex, complex);
|
DROP OPERATOR = (complex, complex);
|
||||||
DROP OPERATOR >= (complex, complex);
|
DROP OPERATOR >= (complex, complex);
|
||||||
DROP OPERATOR > (complex, complex);
|
DROP OPERATOR > (complex, complex);
|
||||||
DROP AGGREGATE complex_sum complex;
|
DROP AGGREGATE complex_sum (complex);
|
||||||
DROP TYPE complex;
|
DROP TYPE complex;
|
||||||
DROP TABLE test_complex, complex_ops_tmp;
|
DROP TABLE test_complex, complex_ops_tmp;
|
||||||
|
Reference in New Issue
Block a user