Commit daea4d8e authored by Andrew Dunstan's avatar Andrew Dunstan

DROP objecttype IF EXISTS for the following objects:
  table view index sequence schema type domain conversion
parent 8ef289db
<!-- $PostgreSQL: pgsql/doc/src/sgml/ref/drop_conversion.sgml,v 1.8 2003/11/29 19:51:38 pgsql Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/ref/drop_conversion.sgml,v 1.9 2005/11/19 17:39:44 adunstan Exp $ -->
<refentry id="SQL-DROPCONVERSION"> <refentry id="SQL-DROPCONVERSION">
<refmeta> <refmeta>
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
DROP CONVERSION <replaceable>name</replaceable> [ CASCADE | RESTRICT ] DROP CONVERSION [ IF EXISTS ] <replaceable>name</replaceable> [ CASCADE | RESTRICT ]
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -34,6 +34,16 @@ DROP CONVERSION <replaceable>name</replaceable> [ CASCADE | RESTRICT ] ...@@ -34,6 +34,16 @@ DROP CONVERSION <replaceable>name</replaceable> [ CASCADE | RESTRICT ]
<title>Parameters</title> <title>Parameters</title>
<variablelist> <variablelist>
<varlistentry>
<term><literal>IF EXISTS</literal></term>
<listitem>
<para>
Do not throw an error if the conversion does not exist.
A notice is issued in this case.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable>name</replaceable></term> <term><replaceable>name</replaceable></term>
......
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_domain.sgml,v 1.15 2005/05/02 01:52:50 neilc Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/drop_domain.sgml,v 1.16 2005/11/19 17:39:44 adunstan Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -20,7 +20,7 @@ PostgreSQL documentation ...@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
DROP DOMAIN <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ] DROP DOMAIN [IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -37,6 +37,16 @@ DROP DOMAIN <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE ...@@ -37,6 +37,16 @@ DROP DOMAIN <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE
<title>Parameters</title> <title>Parameters</title>
<variablelist> <variablelist>
<varlistentry>
<term><literal>IF EXISTS</literal></term>
<listitem>
<para>
Do not throw an error if the domain does not exist. A notice is issued
in this case.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable class="PARAMETER">name</replaceable></term> <term><replaceable class="PARAMETER">name</replaceable></term>
<listitem> <listitem>
...@@ -84,7 +94,9 @@ DROP DOMAIN box; ...@@ -84,7 +94,9 @@ DROP DOMAIN box;
<title>Compatibility</title> <title>Compatibility</title>
<para> <para>
This command conforms to the SQL standard. This command conforms to the SQL standard, except for the
<literal>IF EXISTS</> option, which is a <productname>PostgreSQL</>
extension.
</para> </para>
</refsect1> </refsect1>
......
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_index.sgml,v 1.21 2003/11/29 19:51:38 pgsql Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/drop_index.sgml,v 1.22 2005/11/19 17:39:44 adunstan Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -20,7 +20,7 @@ PostgreSQL documentation ...@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
DROP INDEX <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ] DROP INDEX [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -38,6 +38,16 @@ DROP INDEX <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | ...@@ -38,6 +38,16 @@ DROP INDEX <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE |
<title>Parameters</title> <title>Parameters</title>
<variablelist> <variablelist>
<varlistentry>
<term><literal>IF EXISTS</literal></term>
<listitem>
<para>
Do not throw an error if the index does not exist. A notice is issued
in this case.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable class="PARAMETER">name</replaceable></term> <term><replaceable class="PARAMETER">name</replaceable></term>
<listitem> <listitem>
......
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_schema.sgml,v 1.6 2003/11/29 19:51:38 pgsql Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/drop_schema.sgml,v 1.7 2005/11/19 17:39:44 adunstan Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -20,7 +20,7 @@ PostgreSQL documentation ...@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
DROP SCHEMA <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ] DROP SCHEMA [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -42,6 +42,16 @@ DROP SCHEMA <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE ...@@ -42,6 +42,16 @@ DROP SCHEMA <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE
<title>Parameters</title> <title>Parameters</title>
<variablelist> <variablelist>
<varlistentry>
<term><literal>IF EXISTS</literal></term>
<listitem>
<para>
Do not throw an error if the schema does not exist. A notice is issued
in this case.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable class="PARAMETER">name</replaceable></term> <term><replaceable class="PARAMETER">name</replaceable></term>
<listitem> <listitem>
...@@ -92,7 +102,9 @@ DROP SCHEMA mystuff CASCADE; ...@@ -92,7 +102,9 @@ DROP SCHEMA mystuff CASCADE;
<para> <para>
<command>DROP SCHEMA</command> is fully conforming with the SQL <command>DROP SCHEMA</command> is fully conforming with the SQL
standard, except that the standard only allows one schema to be standard, except that the standard only allows one schema to be
dropped per command. dropped per command, and apart from the
<literal>IF EXISTS</> option, which is a <productname>PostgreSQL</>
extension.
</para> </para>
</refsect1> </refsect1>
......
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_sequence.sgml,v 1.23 2005/11/01 21:09:50 tgl Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/drop_sequence.sgml,v 1.24 2005/11/19 17:39:44 adunstan Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -20,7 +20,7 @@ PostgreSQL documentation ...@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
DROP SEQUENCE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ] DROP SEQUENCE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -36,6 +36,16 @@ DROP SEQUENCE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCAD ...@@ -36,6 +36,16 @@ DROP SEQUENCE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCAD
<title>Parameters</title> <title>Parameters</title>
<variablelist> <variablelist>
<varlistentry>
<term><literal>IF EXISTS</literal></term>
<listitem>
<para>
Do not throw an error if the sequence does not exist. A notice is issued
in this case.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable class="PARAMETER">name</replaceable></term> <term><replaceable class="PARAMETER">name</replaceable></term>
<listitem> <listitem>
...@@ -84,7 +94,9 @@ DROP SEQUENCE serial; ...@@ -84,7 +94,9 @@ DROP SEQUENCE serial;
<para> <para>
<command>DROP SEQUENCE</command> conforms to the <acronym>SQL</acronym> <command>DROP SEQUENCE</command> conforms to the <acronym>SQL</acronym>
standard, except that the standard only allows one standard, except that the standard only allows one
sequence to be dropped per command. sequence to be dropped per command, and apart from the
<literal>IF EXISTS</> option, which is a <productname>PostgreSQL</>
extension.
</para> </para>
</refsect1> </refsect1>
......
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_table.sgml,v 1.22 2005/01/04 00:39:53 tgl Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/drop_table.sgml,v 1.23 2005/11/19 17:39:44 adunstan Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -20,7 +20,7 @@ PostgreSQL documentation ...@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
DROP TABLE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ] DROP TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -48,6 +48,16 @@ DROP TABLE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | ...@@ -48,6 +48,16 @@ DROP TABLE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE |
<title>Parameters</title> <title>Parameters</title>
<variablelist> <variablelist>
<varlistentry>
<term><literal>IF EXISTS</literal></term>
<listitem>
<para>
Do not throw an error if the table does not exist. A notice is issued
in this case.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable class="PARAMETER">name</replaceable></term> <term><replaceable class="PARAMETER">name</replaceable></term>
<listitem> <listitem>
...@@ -97,7 +107,9 @@ DROP TABLE films, distributors; ...@@ -97,7 +107,9 @@ DROP TABLE films, distributors;
<para> <para>
This command conforms to the SQL standard, except that the standard only This command conforms to the SQL standard, except that the standard only
allows one table to be dropped per command. allows one table to be dropped per command, and apart from the
<literal>IF EXISTS</> option, which is a <productname>PostgreSQL</>
extension.
</para> </para>
</refsect1> </refsect1>
......
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_type.sgml,v 1.26 2004/06/25 21:55:50 tgl Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/drop_type.sgml,v 1.27 2005/11/19 17:39:44 adunstan Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -20,7 +20,7 @@ PostgreSQL documentation ...@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
DROP TYPE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ] DROP TYPE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -37,6 +37,16 @@ DROP TYPE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | ...@@ -37,6 +37,16 @@ DROP TYPE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE |
<title>Parameters</title> <title>Parameters</title>
<variablelist> <variablelist>
<varlistentry>
<term><literal>IF EXISTS</literal></term>
<listitem>
<para>
Do not throw an error if the type does not exist. A notice is issued
in this case.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable class="PARAMETER">name</replaceable></term> <term><replaceable class="PARAMETER">name</replaceable></term>
<listitem> <listitem>
...@@ -84,7 +94,9 @@ DROP TYPE box; ...@@ -84,7 +94,9 @@ DROP TYPE box;
<para> <para>
This command is similar to the corresponding command in the SQL This command is similar to the corresponding command in the SQL
standard, but note that the <command>CREATE TYPE</command> command standard, aapart from the <literal>IF EXISTS</>
option, which is a <productname>PostgreSQL</> extension.
But note that the <command>CREATE TYPE</command> command
and the data type extension mechanisms in and the data type extension mechanisms in
<productname>PostgreSQL</productname> differ from the SQL standard. <productname>PostgreSQL</productname> differ from the SQL standard.
</para> </para>
......
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_view.sgml,v 1.21 2005/01/04 00:39:53 tgl Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/drop_view.sgml,v 1.22 2005/11/19 17:39:44 adunstan Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -20,7 +20,7 @@ PostgreSQL documentation ...@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
DROP VIEW <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ] DROP VIEW [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -37,6 +37,16 @@ DROP VIEW <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | ...@@ -37,6 +37,16 @@ DROP VIEW <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE |
<title>Parameters</title> <title>Parameters</title>
<variablelist> <variablelist>
<varlistentry>
<term><literal>IF EXISTS</literal></term>
<listitem>
<para>
Do not throw an error if the view does not exist. A notice is issued
in this case.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable class="PARAMETER">name</replaceable></term> <term><replaceable class="PARAMETER">name</replaceable></term>
<listitem> <listitem>
...@@ -84,7 +94,9 @@ DROP VIEW kinds; ...@@ -84,7 +94,9 @@ DROP VIEW kinds;
<para> <para>
This command conforms to the SQL standard, except that the standard only This command conforms to the SQL standard, except that the standard only
allows one view to be dropped per command. allows one view to be dropped per command, and apart from the
<literal>IF EXISTS</> option, which is a <productname>PostgreSQL</>
extension.
</para> </para>
</refsect1> </refsect1>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/conversioncmds.c,v 1.23 2005/10/15 02:49:15 momjian Exp $ * $PostgreSQL: pgsql/src/backend/commands/conversioncmds.c,v 1.24 2005/11/19 17:39:44 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -98,16 +98,29 @@ CreateConversionCommand(CreateConversionStmt *stmt) ...@@ -98,16 +98,29 @@ CreateConversionCommand(CreateConversionStmt *stmt)
* DROP CONVERSION * DROP CONVERSION
*/ */
void void
DropConversionCommand(List *name, DropBehavior behavior) DropConversionCommand(List *name, DropBehavior behavior, bool missing_ok)
{ {
Oid conversionOid; Oid conversionOid;
conversionOid = FindConversionByName(name); conversionOid = FindConversionByName(name);
if (!OidIsValid(conversionOid)) if (!OidIsValid(conversionOid))
ereport(ERROR, {
(errcode(ERRCODE_UNDEFINED_OBJECT), if (! missing_ok)
errmsg("conversion \"%s\" does not exist", {
NameListToString(name)))); ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("conversion \"%s\" does not exist",
NameListToString(name))));
}
else
{
ereport(NOTICE,
(errmsg("conversion \"%s\" does not exist, skipping",
NameListToString(name))));
}
return;
}
ConversionDrop(conversionOid, behavior); ConversionDrop(conversionOid, behavior);
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/schemacmds.c,v 1.35 2005/10/15 02:49:15 momjian Exp $ * $PostgreSQL: pgsql/src/backend/commands/schemacmds.c,v 1.36 2005/11/19 17:39:44 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -147,7 +147,7 @@ CreateSchemaCommand(CreateSchemaStmt *stmt) ...@@ -147,7 +147,7 @@ CreateSchemaCommand(CreateSchemaStmt *stmt)
* Removes a schema. * Removes a schema.
*/ */
void void
RemoveSchema(List *names, DropBehavior behavior) RemoveSchema(List *names, DropBehavior behavior, bool missing_ok)
{ {
char *namespaceName; char *namespaceName;
Oid namespaceId; Oid namespaceId;
...@@ -163,9 +163,22 @@ RemoveSchema(List *names, DropBehavior behavior) ...@@ -163,9 +163,22 @@ RemoveSchema(List *names, DropBehavior behavior)
CStringGetDatum(namespaceName), CStringGetDatum(namespaceName),
0, 0, 0); 0, 0, 0);
if (!OidIsValid(namespaceId)) if (!OidIsValid(namespaceId))
ereport(ERROR, {
(errcode(ERRCODE_UNDEFINED_SCHEMA), if (!missing_ok)
errmsg("schema \"%s\" does not exist", namespaceName))); {
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_SCHEMA),
errmsg("schema \"%s\" does not exist", namespaceName)));
}
else
{
ereport(NOTICE,
(errmsg("schema \"%s\" does not exist, skipping",
namespaceName)));
}
return;
}
/* Permission check */ /* Permission check */
if (!pg_namespace_ownercheck(namespaceId, GetUserId())) if (!pg_namespace_ownercheck(namespaceId, GetUserId()))
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.82 2005/10/18 01:06:24 tgl Exp $ * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.83 2005/11/19 17:39:44 adunstan Exp $
* *
* DESCRIPTION * DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the * The "DefineFoo" routines take the parse tree and pick out the
...@@ -398,7 +398,7 @@ DefineType(List *names, List *parameters) ...@@ -398,7 +398,7 @@ DefineType(List *names, List *parameters)
* Removes a datatype. * Removes a datatype.
*/ */
void void
RemoveType(List *names, DropBehavior behavior) RemoveType(List *names, DropBehavior behavior, bool missing_ok)
{ {
TypeName *typename; TypeName *typename;
Oid typeoid; Oid typeoid;
...@@ -414,10 +414,23 @@ RemoveType(List *names, DropBehavior behavior) ...@@ -414,10 +414,23 @@ RemoveType(List *names, DropBehavior behavior)
/* Use LookupTypeName here so that shell types can be removed. */ /* Use LookupTypeName here so that shell types can be removed. */
typeoid = LookupTypeName(typename); typeoid = LookupTypeName(typename);
if (!OidIsValid(typeoid)) if (!OidIsValid(typeoid))
ereport(ERROR, {
(errcode(ERRCODE_UNDEFINED_OBJECT), if (!missing_ok)
errmsg("type \"%s\" does not exist", {
TypeNameToString(typename)))); ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("type \"%s\" does not exist",
TypeNameToString(typename))));
}
else
{
ereport(NOTICE,
(errmsg("type \"%s\" does not exist, skipping",
TypeNameToString(typename))));
}
return;
}
tup = SearchSysCache(TYPEOID, tup = SearchSysCache(TYPEOID,
ObjectIdGetDatum(typeoid), ObjectIdGetDatum(typeoid),
...@@ -779,7 +792,7 @@ DefineDomain(CreateDomainStmt *stmt) ...@@ -779,7 +792,7 @@ DefineDomain(CreateDomainStmt *stmt)
* This is identical to RemoveType except we insist it be a domain. * This is identical to RemoveType except we insist it be a domain.
*/ */
void void
RemoveDomain(List *names, DropBehavior behavior) RemoveDomain(List *names, DropBehavior behavior, bool missing_ok)
{ {
TypeName *typename; TypeName *typename;
Oid typeoid; Oid typeoid;
...@@ -796,10 +809,23 @@ RemoveDomain(List *names, DropBehavior behavior) ...@@ -796,10 +809,23 @@ RemoveDomain(List *names, DropBehavior behavior)
/* Use LookupTypeName here so that shell types can be removed. */ /* Use LookupTypeName here so that shell types can be removed. */
typeoid = LookupTypeName(typename); typeoid = LookupTypeName(typename);
if (!OidIsValid(typeoid)) if (!OidIsValid(typeoid))
ereport(ERROR, {
(errcode(ERRCODE_UNDEFINED_OBJECT), if (!missing_ok)
errmsg("type \"%s\" does not exist", {
TypeNameToString(typename)))); ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("type \"%s\" does not exist",
TypeNameToString(typename))));
}
else
{
ereport(NOTICE,
(errmsg("type \"%s\" does not exist, skipping",
TypeNameToString(typename))));
}
return;
}
tup = SearchSysCache(TYPEOID, tup = SearchSysCache(TYPEOID,
ObjectIdGetDatum(typeoid), ObjectIdGetDatum(typeoid),
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.512 2005/11/13 19:11:28 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.513 2005/11/19 17:39:44 adunstan Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -173,7 +173,7 @@ static void doNegateFloat(Value *v); ...@@ -173,7 +173,7 @@ static void doNegateFloat(Value *v);
%type <ival> opt_lock lock_type cast_context %type <ival> opt_lock lock_type cast_context
%type <boolean> opt_force opt_or_replace %type <boolean> opt_force opt_or_replace
opt_grant_grant_option opt_grant_admin_option opt_grant_grant_option opt_grant_admin_option
opt_nowait opt_nowait
%type <boolean> like_including_defaults %type <boolean> like_including_defaults
...@@ -362,7 +362,7 @@ static void doNegateFloat(Value *v); ...@@ -362,7 +362,7 @@ static void doNegateFloat(Value *v);
HANDLER HAVING HEADER HOLD HOUR_P HANDLER HAVING HEADER HOLD HOUR_P
ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT
INDEX INHERIT INHERITS INITIALLY INNER_P INOUT INPUT_P INDEX INHERIT INHERITS INITIALLY INNER_P INOUT INPUT_P
INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT
INTERVAL INTO INVOKER IS ISNULL ISOLATION INTERVAL INTO INVOKER IS ISNULL ISOLATION
...@@ -2818,20 +2818,32 @@ DropOpClassStmt: ...@@ -2818,20 +2818,32 @@ DropOpClassStmt:
* *
* QUERY: * QUERY:
* *
* DROP itemtype itemname [, itemname ...] [ RESTRICT | CASCADE ] * DROP itemtype [ IF EXISTS ] itemname [, itemname ...]
* [ RESTRICT | CASCADE ]
* *
*****************************************************************************/ *****************************************************************************/
DropStmt: DROP drop_type any_name_list opt_drop_behavior DropStmt: DROP drop_type IF_P EXISTS any_name_list opt_drop_behavior
{ {
DropStmt *n = makeNode(DropStmt); DropStmt *n = makeNode(DropStmt);
n->removeType = $2; n->removeType = $2;
n->missing_ok = TRUE;
n->objects = $5;
n->behavior = $6;
$$ = (Node *)n;
}
| DROP drop_type any_name_list opt_drop_behavior
{
DropStmt *n = makeNode(DropStmt);
n->removeType = $2;
n->missing_ok = FALSE;
n->objects = $3; n->objects = $3;
n->behavior = $4; n->behavior = $4;
$$ = (Node *)n; $$ = (Node *)n;
} }
; ;
drop_type: TABLE { $$ = OBJECT_TABLE; } drop_type: TABLE { $$ = OBJECT_TABLE; }
| SEQUENCE { $$ = OBJECT_SEQUENCE; } | SEQUENCE { $$ = OBJECT_SEQUENCE; }
| VIEW { $$ = OBJECT_VIEW; } | VIEW { $$ = OBJECT_VIEW; }
...@@ -8159,6 +8171,7 @@ unreserved_keyword: ...@@ -8159,6 +8171,7 @@ unreserved_keyword:
| HEADER | HEADER
| HOLD | HOLD
| HOUR_P | HOUR_P
| IF_P
| IMMEDIATE | IMMEDIATE
| IMMUTABLE | IMMUTABLE
| IMPLICIT_P | IMPLICIT_P
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.166 2005/10/15 02:49:22 momjian Exp $ * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.167 2005/11/19 17:39:44 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -160,6 +160,7 @@ static const ScanKeyword ScanKeywords[] = { ...@@ -160,6 +160,7 @@ static const ScanKeyword ScanKeywords[] = {
{"header", HEADER}, {"header", HEADER},
{"hold", HOLD}, {"hold", HOLD},
{"hour", HOUR_P}, {"hour", HOUR_P},
{"if",IF_P},
{"ilike", ILIKE}, {"ilike", ILIKE},
{"immediate", IMMEDIATE}, {"immediate", IMMEDIATE},
{"immutable", IMMUTABLE}, {"immutable", IMMUTABLE},
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.245 2005/10/15 02:49:27 momjian Exp $ * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.246 2005/11/19 17:39:45 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -67,6 +67,7 @@ struct msgstrings ...@@ -67,6 +67,7 @@ struct msgstrings
char kind; char kind;
int nonexistent_code; int nonexistent_code;
const char *nonexistent_msg; const char *nonexistent_msg;
const char *skipping_msg;
const char *nota_msg; const char *nota_msg;
const char *drophint_msg; const char *drophint_msg;
}; };
...@@ -75,26 +76,31 @@ static const struct msgstrings msgstringarray[] = { ...@@ -75,26 +76,31 @@ static const struct msgstrings msgstringarray[] = {
{RELKIND_RELATION, {RELKIND_RELATION,
ERRCODE_UNDEFINED_TABLE, ERRCODE_UNDEFINED_TABLE,
gettext_noop("table \"%s\" does not exist"), gettext_noop("table \"%s\" does not exist"),
gettext_noop("table \"%s\" does not exist, skipping"),
gettext_noop("\"%s\" is not a table"), gettext_noop("\"%s\" is not a table"),
gettext_noop("Use DROP TABLE to remove a table.")}, gettext_noop("Use DROP TABLE to remove a table.")},
{RELKIND_SEQUENCE, {RELKIND_SEQUENCE,
ERRCODE_UNDEFINED_TABLE, ERRCODE_UNDEFINED_TABLE,
gettext_noop("sequence \"%s\" does not exist"), gettext_noop("sequence \"%s\" does not exist"),
gettext_noop("sequence \"%s\" does not exist, skipping"),
gettext_noop("\"%s\" is not a sequence"), gettext_noop("\"%s\" is not a sequence"),
gettext_noop("Use DROP SEQUENCE to remove a sequence.")}, gettext_noop("Use DROP SEQUENCE to remove a sequence.")},
{RELKIND_VIEW, {RELKIND_VIEW,
ERRCODE_UNDEFINED_TABLE, ERRCODE_UNDEFINED_TABLE,
gettext_noop("view \"%s\" does not exist"), gettext_noop("view \"%s\" does not exist"),
gettext_noop("view \"%s\" does not exist, skipping"),
gettext_noop("\"%s\" is not a view"), gettext_noop("\"%s\" is not a view"),
gettext_noop("Use DROP VIEW to remove a view.")}, gettext_noop("Use DROP VIEW to remove a view.")},
{RELKIND_INDEX, {RELKIND_INDEX,
ERRCODE_UNDEFINED_OBJECT, ERRCODE_UNDEFINED_OBJECT,
gettext_noop("index \"%s\" does not exist"), gettext_noop("index \"%s\" does not exist"),
gettext_noop("index \"%s\" does not exist, skipping"),
gettext_noop("\"%s\" is not an index"), gettext_noop("\"%s\" is not an index"),
gettext_noop("Use DROP INDEX to remove an index.")}, gettext_noop("Use DROP INDEX to remove an index.")},
{RELKIND_COMPOSITE_TYPE, {RELKIND_COMPOSITE_TYPE,
ERRCODE_UNDEFINED_OBJECT, ERRCODE_UNDEFINED_OBJECT,
gettext_noop("type \"%s\" does not exist"), gettext_noop("type \"%s\" does not exist"),
gettext_noop("type \"%s\" does not exist, skipping"),
gettext_noop("\"%s\" is not a type"), gettext_noop("\"%s\" is not a type"),
gettext_noop("Use DROP TYPE to remove a type.")}, gettext_noop("Use DROP TYPE to remove a type.")},
{'\0', 0, NULL, NULL, NULL} {'\0', 0, NULL, NULL, NULL}
...@@ -132,23 +138,40 @@ DropErrorMsgWrongType(char *relname, char wrongkind, char rightkind) ...@@ -132,23 +138,40 @@ DropErrorMsgWrongType(char *relname, char wrongkind, char rightkind)
* non-existent relation * non-existent relation
*/ */
static void static void
DropErrorMsgNonExistent(RangeVar *rel, char rightkind) DropErrorMsgNonExistent(RangeVar *rel, char rightkind, bool missing_ok)
{ {
const struct msgstrings *rentry; const struct msgstrings *rentry;
for (rentry = msgstringarray; rentry->kind != '\0'; rentry++) for (rentry = msgstringarray; rentry->kind != '\0'; rentry++)
{ {
if (rentry->kind == rightkind) if (rentry->kind == rightkind)
ereport(ERROR, {
(errcode(rentry->nonexistent_code), if (! missing_ok)
errmsg(rentry->nonexistent_msg, rel->relname))); {
ereport(ERROR,
(errcode(rentry->nonexistent_code),
errmsg(rentry->nonexistent_msg, rel->relname)));
}
else
{
ereport(NOTICE, (errmsg(rentry->skipping_msg, rel->relname)));
break;
}
}
} }
Assert(false); /* Should be impossible */ Assert(rentry->kind != '\0'); /* Should be impossible */
} }
static void /*
CheckDropPermissions(RangeVar *rel, char rightkind) * returns false if missing_ok is true and the object does not exist,
* true if object exists and permissions are OK,
* errors otherwise
*
*/
static bool
CheckDropPermissions(RangeVar *rel, char rightkind, bool missing_ok)
{ {
Oid relOid; Oid relOid;
HeapTuple tuple; HeapTuple tuple;
...@@ -156,7 +179,10 @@ CheckDropPermissions(RangeVar *rel, char rightkind) ...@@ -156,7 +179,10 @@ CheckDropPermissions(RangeVar *rel, char rightkind)
relOid = RangeVarGetRelid(rel, true); relOid = RangeVarGetRelid(rel, true);
if (!OidIsValid(relOid)) if (!OidIsValid(relOid))
DropErrorMsgNonExistent(rel, rightkind); {
DropErrorMsgNonExistent(rel, rightkind, missing_ok);
return false;
}
tuple = SearchSysCache(RELOID, tuple = SearchSysCache(RELOID,
ObjectIdGetDatum(relOid), ObjectIdGetDatum(relOid),
...@@ -183,6 +209,8 @@ CheckDropPermissions(RangeVar *rel, char rightkind) ...@@ -183,6 +209,8 @@ CheckDropPermissions(RangeVar *rel, char rightkind)
rel->relname))); rel->relname)));
ReleaseSysCache(tuple); ReleaseSysCache(tuple);
return true;
} }
/* /*
...@@ -528,31 +556,36 @@ ProcessUtility(Node *parsetree, ...@@ -528,31 +556,36 @@ ProcessUtility(Node *parsetree,
{ {
case OBJECT_TABLE: case OBJECT_TABLE:
rel = makeRangeVarFromNameList(names); rel = makeRangeVarFromNameList(names);
CheckDropPermissions(rel, RELKIND_RELATION); if (CheckDropPermissions(rel, RELKIND_RELATION,
RemoveRelation(rel, stmt->behavior); stmt->missing_ok))
RemoveRelation(rel, stmt->behavior);
break; break;
case OBJECT_SEQUENCE: case OBJECT_SEQUENCE:
rel = makeRangeVarFromNameList(names); rel = makeRangeVarFromNameList(names);
CheckDropPermissions(rel, RELKIND_SEQUENCE); if (CheckDropPermissions(rel, RELKIND_SEQUENCE,
RemoveRelation(rel, stmt->behavior); stmt->missing_ok))
RemoveRelation(rel, stmt->behavior);
break; break;
case OBJECT_VIEW: case OBJECT_VIEW:
rel = makeRangeVarFromNameList(names); rel = makeRangeVarFromNameList(names);
CheckDropPermissions(rel, RELKIND_VIEW); if (CheckDropPermissions(rel, RELKIND_VIEW,
RemoveView(rel, stmt->behavior); stmt->missing_ok))
RemoveView(rel, stmt->behavior);
break; break;
case OBJECT_INDEX: case OBJECT_INDEX:
rel = makeRangeVarFromNameList(names); rel = makeRangeVarFromNameList(names);
CheckDropPermissions(rel, RELKIND_INDEX); if (CheckDropPermissions(rel, RELKIND_INDEX,
RemoveIndex(rel, stmt->behavior); stmt->missing_ok))
RemoveIndex(rel, stmt->behavior);
break; break;
case OBJECT_TYPE: case OBJECT_TYPE:
/* RemoveType does its own permissions checks */ /* RemoveType does its own permissions checks */
RemoveType(names, stmt->behavior); RemoveType(names, stmt->behavior,
stmt->missing_ok);
break; break;
case OBJECT_DOMAIN: case OBJECT_DOMAIN:
...@@ -560,11 +593,13 @@ ProcessUtility(Node *parsetree, ...@@ -560,11 +593,13 @@ ProcessUtility(Node *parsetree,
/* /*
* RemoveDomain does its own permissions checks * RemoveDomain does its own permissions checks
*/ */
RemoveDomain(names, stmt->behavior); RemoveDomain(names, stmt->behavior,
stmt->missing_ok);
break; break;
case OBJECT_CONVERSION: case OBJECT_CONVERSION:
DropConversionCommand(names, stmt->behavior); DropConversionCommand(names, stmt->behavior,
stmt->missing_ok);
break; break;
case OBJECT_SCHEMA: case OBJECT_SCHEMA:
...@@ -572,7 +607,8 @@ ProcessUtility(Node *parsetree, ...@@ -572,7 +607,8 @@ ProcessUtility(Node *parsetree,
/* /*
* RemoveSchema does its own permissions checks * RemoveSchema does its own permissions checks
*/ */
RemoveSchema(names, stmt->behavior); RemoveSchema(names, stmt->behavior,
stmt->missing_ok);
break; break;
default: default:
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/commands/conversioncmds.h,v 1.10 2005/06/28 05:09:12 tgl Exp $ * $PostgreSQL: pgsql/src/include/commands/conversioncmds.h,v 1.11 2005/11/19 17:39:45 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
#include "nodes/parsenodes.h" #include "nodes/parsenodes.h"
extern void CreateConversionCommand(CreateConversionStmt *parsetree); extern void CreateConversionCommand(CreateConversionStmt *parsetree);
extern void DropConversionCommand(List *conversion_name, DropBehavior behavior); extern void DropConversionCommand(List *conversion_name,
DropBehavior behavior, bool missing_ok);
extern void RenameConversion(List *name, const char *newname); extern void RenameConversion(List *name, const char *newname);
extern void AlterConversionOwner(List *name, Oid newOwnerId); extern void AlterConversionOwner(List *name, Oid newOwnerId);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/commands/schemacmds.h,v 1.10 2005/06/28 05:09:12 tgl Exp $ * $PostgreSQL: pgsql/src/include/commands/schemacmds.h,v 1.11 2005/11/19 17:39:45 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
extern void CreateSchemaCommand(CreateSchemaStmt *parsetree); extern void CreateSchemaCommand(CreateSchemaStmt *parsetree);
extern void RemoveSchema(List *names, DropBehavior behavior); extern void RemoveSchema(List *names, DropBehavior behavior, bool missing_ok);
extern void RemoveSchemaById(Oid schemaOid); extern void RemoveSchemaById(Oid schemaOid);
extern void RenameSchema(const char *oldname, const char *newname); extern void RenameSchema(const char *oldname, const char *newname);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/commands/typecmds.h,v 1.14 2005/10/15 02:49:44 momjian Exp $ * $PostgreSQL: pgsql/src/include/commands/typecmds.h,v 1.15 2005/11/19 17:39:45 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -20,10 +20,10 @@ ...@@ -20,10 +20,10 @@
#define DEFAULT_TYPDELIM ',' #define DEFAULT_TYPDELIM ','
extern void DefineType(List *names, List *parameters); extern void DefineType(List *names, List *parameters);
extern void RemoveType(List *names, DropBehavior behavior); extern void RemoveType(List *names, DropBehavior behavior, bool missing_ok);
extern void RemoveTypeById(Oid typeOid); extern void RemoveTypeById(Oid typeOid);
extern void DefineDomain(CreateDomainStmt *stmt); extern void DefineDomain(CreateDomainStmt *stmt);
extern void RemoveDomain(List *names, DropBehavior behavior); extern void RemoveDomain(List *names, DropBehavior behavior, bool missing_ok);
extern Oid DefineCompositeType(const RangeVar *typevar, List *coldeflist); extern Oid DefineCompositeType(const RangeVar *typevar, List *coldeflist);
extern void AlterDomainDefault(List *names, Node *defaultRaw); extern void AlterDomainDefault(List *names, Node *defaultRaw);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.292 2005/10/26 19:21:55 tgl Exp $ * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.293 2005/11/19 17:39:45 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1278,6 +1278,7 @@ typedef struct DropStmt ...@@ -1278,6 +1278,7 @@ typedef struct DropStmt
List *objects; /* list of sublists of names (as Values) */ List *objects; /* list of sublists of names (as Values) */
ObjectType removeType; /* object type */ ObjectType removeType; /* object type */
DropBehavior behavior; /* RESTRICT or CASCADE behavior */ DropBehavior behavior; /* RESTRICT or CASCADE behavior */
bool missing_ok; /* skip error if object is missing? */
} DropStmt; } DropStmt;
/* ---------------------- /* ----------------------
......
--
-- IF EXISTS tests
--
-- table (will be really dropped at the end)
DROP TABLE test_exists;
ERROR: table "test_exists" does not exist
DROP TABLE IF EXISTS test_exists;
NOTICE: table "test_exists" does not exist, skipping
CREATE TABLE test_exists (a int, b text);
-- view
DROP VIEW test_view_exists;
ERROR: view "test_view_exists" does not exist
DROP VIEW IF EXISTS test_view_exists;
NOTICE: view "test_view_exists" does not exist, skipping
CREATE VIEW test_view_exists AS select * from test_exists;
DROP VIEW IF EXISTS test_view_exists;
DROP VIEW test_view_exists;
ERROR: view "test_view_exists" does not exist
-- index
DROP INDEX test_index_exists;
ERROR: index "test_index_exists" does not exist
DROP INDEX IF EXISTS test_index_exists;
NOTICE: index "test_index_exists" does not exist, skipping
CREATE INDEX test_index_exists on test_exists(a);
DROP INDEX IF EXISTS test_index_exists;
DROP INDEX test_index_exists;
ERROR: index "test_index_exists" does not exist
-- sequence
DROP SEQUENCE test_sequence_exists;
ERROR: sequence "test_sequence_exists" does not exist
DROP SEQUENCE IF EXISTS test_sequence_exists;
NOTICE: sequence "test_sequence_exists" does not exist, skipping
CREATE SEQUENCE test_sequence_exists;
DROP SEQUENCE IF EXISTS test_sequence_exists;
DROP SEQUENCE test_sequence_exists;
ERROR: sequence "test_sequence_exists" does not exist
-- schema
DROP SCHEMA test_schema_exists;
ERROR: schema "test_schema_exists" does not exist
DROP SCHEMA IF EXISTS test_schema_exists;
NOTICE: schema "test_schema_exists" does not exist, skipping
CREATE SCHEMA test_schema_exists;
DROP SCHEMA IF EXISTS test_schema_exists;
DROP SCHEMA test_schema_exists;
ERROR: schema "test_schema_exists" does not exist
-- type
DROP TYPE test_type_exists;
ERROR: type "test_type_exists" does not exist
DROP TYPE IF EXISTS test_type_exists;
NOTICE: type "test_type_exists" does not exist, skipping
CREATE type test_type_exists as (a int, b text);
DROP TYPE IF EXISTS test_type_exists;
DROP TYPE test_type_exists;
ERROR: type "test_type_exists" does not exist
-- domain
DROP DOMAIN test_domain_exists;
ERROR: type "test_domain_exists" does not exist
DROP DOMAIN IF EXISTS test_domain_exists;
NOTICE: type "test_domain_exists" does not exist, skipping
CREATE domain test_domain_exists as int not null check (value > 0);
DROP DOMAIN IF EXISTS test_domain_exists;
DROP DOMAIN test_domain_exists;
ERROR: type "test_domain_exists" does not exist
-- drop the table
DROP TABLE IF EXISTS test_exists;
DROP TABLE test_exists;
ERROR: table "test_exists" does not exist
...@@ -38,7 +38,7 @@ test: copy ...@@ -38,7 +38,7 @@ test: copy
# ---------- # ----------
# The third group of parallel test # The third group of parallel test
# ---------- # ----------
test: constraints triggers create_misc create_aggregate create_operator inherit vacuum test: constraints triggers create_misc create_aggregate create_operator inherit vacuum drop_if_exists
# Depends on the above # Depends on the above
test: create_index create_view test: create_index create_view
......
# $PostgreSQL: pgsql/src/test/regress/serial_schedule,v 1.28 2005/07/07 20:40:01 tgl Exp $ # $PostgreSQL: pgsql/src/test/regress/serial_schedule,v 1.29 2005/11/19 17:39:45 adunstan Exp $
# This should probably be in an order similar to parallel_schedule. # This should probably be in an order similar to parallel_schedule.
test: boolean test: boolean
test: char test: char
...@@ -49,6 +49,7 @@ test: create_misc ...@@ -49,6 +49,7 @@ test: create_misc
test: create_aggregate test: create_aggregate
test: create_operator test: create_operator
test: create_index test: create_index
test: drop_if_exists
test: inherit test: inherit
test: vacuum test: vacuum
test: create_view test: create_view
......
--
-- IF EXISTS tests
--
-- table (will be really dropped at the end)
DROP TABLE test_exists;
DROP TABLE IF EXISTS test_exists;
CREATE TABLE test_exists (a int, b text);
-- view
DROP VIEW test_view_exists;
DROP VIEW IF EXISTS test_view_exists;
CREATE VIEW test_view_exists AS select * from test_exists;
DROP VIEW IF EXISTS test_view_exists;
DROP VIEW test_view_exists;
-- index
DROP INDEX test_index_exists;
DROP INDEX IF EXISTS test_index_exists;
CREATE INDEX test_index_exists on test_exists(a);
DROP INDEX IF EXISTS test_index_exists;
DROP INDEX test_index_exists;
-- sequence
DROP SEQUENCE test_sequence_exists;
DROP SEQUENCE IF EXISTS test_sequence_exists;
CREATE SEQUENCE test_sequence_exists;
DROP SEQUENCE IF EXISTS test_sequence_exists;
DROP SEQUENCE test_sequence_exists;
-- schema
DROP SCHEMA test_schema_exists;
DROP SCHEMA IF EXISTS test_schema_exists;
CREATE SCHEMA test_schema_exists;
DROP SCHEMA IF EXISTS test_schema_exists;
DROP SCHEMA test_schema_exists;
-- type
DROP TYPE test_type_exists;
DROP TYPE IF EXISTS test_type_exists;
CREATE type test_type_exists as (a int, b text);
DROP TYPE IF EXISTS test_type_exists;
DROP TYPE test_type_exists;
-- domain
DROP DOMAIN test_domain_exists;
DROP DOMAIN IF EXISTS test_domain_exists;
CREATE domain test_domain_exists as int not null check (value > 0);
DROP DOMAIN IF EXISTS test_domain_exists;
DROP DOMAIN test_domain_exists;
-- drop the table
DROP TABLE IF EXISTS test_exists;
DROP TABLE test_exists;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment