Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
daea4d8e
Commit
daea4d8e
authored
Nov 19, 2005
by
Andrew Dunstan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DROP objecttype IF EXISTS for the following objects:
table view index sequence schema type domain conversion
parent
8ef289db
Changes
22
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
436 additions
and
81 deletions
+436
-81
doc/src/sgml/ref/drop_conversion.sgml
doc/src/sgml/ref/drop_conversion.sgml
+12
-2
doc/src/sgml/ref/drop_domain.sgml
doc/src/sgml/ref/drop_domain.sgml
+15
-3
doc/src/sgml/ref/drop_index.sgml
doc/src/sgml/ref/drop_index.sgml
+12
-2
doc/src/sgml/ref/drop_schema.sgml
doc/src/sgml/ref/drop_schema.sgml
+15
-3
doc/src/sgml/ref/drop_sequence.sgml
doc/src/sgml/ref/drop_sequence.sgml
+15
-3
doc/src/sgml/ref/drop_table.sgml
doc/src/sgml/ref/drop_table.sgml
+15
-3
doc/src/sgml/ref/drop_type.sgml
doc/src/sgml/ref/drop_type.sgml
+15
-3
doc/src/sgml/ref/drop_view.sgml
doc/src/sgml/ref/drop_view.sgml
+15
-3
src/backend/commands/conversioncmds.c
src/backend/commands/conversioncmds.c
+19
-6
src/backend/commands/schemacmds.c
src/backend/commands/schemacmds.c
+18
-5
src/backend/commands/typecmds.c
src/backend/commands/typecmds.c
+37
-11
src/backend/parser/gram.y
src/backend/parser/gram.y
+18
-5
src/backend/parser/keywords.c
src/backend/parser/keywords.c
+2
-1
src/backend/tcop/utility.c
src/backend/tcop/utility.c
+57
-21
src/include/commands/conversioncmds.h
src/include/commands/conversioncmds.h
+3
-2
src/include/commands/schemacmds.h
src/include/commands/schemacmds.h
+2
-2
src/include/commands/typecmds.h
src/include/commands/typecmds.h
+3
-3
src/include/nodes/parsenodes.h
src/include/nodes/parsenodes.h
+2
-1
src/test/regress/expected/drop_if_exists.out
src/test/regress/expected/drop_if_exists.out
+67
-0
src/test/regress/parallel_schedule
src/test/regress/parallel_schedule
+1
-1
src/test/regress/serial_schedule
src/test/regress/serial_schedule
+2
-1
src/test/regress/sql/drop_if_exists.sql
src/test/regress/sql/drop_if_exists.sql
+91
-0
No files found.
doc/src/sgml/ref/drop_conversion.sgml
View file @
daea4d8e
<!-- $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">
<refmeta>
...
...
@@ -17,7 +17,7 @@
<refsynopsisdiv>
<synopsis>
DROP CONVERSION <replaceable>name</replaceable> [ CASCADE | RESTRICT ]
DROP CONVERSION
[ IF EXISTS ]
<replaceable>name</replaceable> [ CASCADE | RESTRICT ]
</synopsis>
</refsynopsisdiv>
...
...
@@ -34,6 +34,16 @@ DROP CONVERSION <replaceable>name</replaceable> [ CASCADE | RESTRICT ]
<title>Parameters</title>
<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>
<term><replaceable>name</replaceable></term>
...
...
doc/src/sgml/ref/drop_domain.sgml
View file @
daea4d8e
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_domain.sgml,v 1.1
5 2005/05/02 01:52:50 neilc
Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_domain.sgml,v 1.1
6 2005/11/19 17:39:44 adunstan
Exp $
PostgreSQL documentation
-->
...
...
@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
DROP DOMAIN <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
DROP DOMAIN
[IF EXISTS ]
<replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis>
</refsynopsisdiv>
...
...
@@ -37,6 +37,16 @@ DROP DOMAIN <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE
<title>Parameters</title>
<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>
<term><replaceable class="PARAMETER">name</replaceable></term>
<listitem>
...
...
@@ -84,7 +94,9 @@ DROP DOMAIN box;
<title>Compatibility</title>
<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>
</refsect1>
...
...
doc/src/sgml/ref/drop_index.sgml
View file @
daea4d8e
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_index.sgml,v 1.2
1 2003/11/29 19:51:38 pgsql
Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_index.sgml,v 1.2
2 2005/11/19 17:39:44 adunstan
Exp $
PostgreSQL documentation
-->
...
...
@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
DROP INDEX <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
DROP INDEX
[ IF EXISTS ]
<replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis>
</refsynopsisdiv>
...
...
@@ -38,6 +38,16 @@ DROP INDEX <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE |
<title>Parameters</title>
<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>
<term><replaceable class="PARAMETER">name</replaceable></term>
<listitem>
...
...
doc/src/sgml/ref/drop_schema.sgml
View file @
daea4d8e
<!--
$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
-->
...
...
@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
DROP SCHEMA <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
DROP SCHEMA
[ IF EXISTS ]
<replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis>
</refsynopsisdiv>
...
...
@@ -42,6 +42,16 @@ DROP SCHEMA <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE
<title>Parameters</title>
<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>
<term><replaceable class="PARAMETER">name</replaceable></term>
<listitem>
...
...
@@ -92,7 +102,9 @@ DROP SCHEMA mystuff CASCADE;
<para>
<command>DROP SCHEMA</command> is fully conforming with the SQL
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>
</refsect1>
...
...
doc/src/sgml/ref/drop_sequence.sgml
View file @
daea4d8e
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_sequence.sgml,v 1.2
3 2005/11/01 21:09:50 tgl
Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_sequence.sgml,v 1.2
4 2005/11/19 17:39:44 adunstan
Exp $
PostgreSQL documentation
-->
...
...
@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
DROP SEQUENCE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
DROP SEQUENCE
[ IF EXISTS ]
<replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis>
</refsynopsisdiv>
...
...
@@ -36,6 +36,16 @@ DROP SEQUENCE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCAD
<title>Parameters</title>
<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>
<term><replaceable class="PARAMETER">name</replaceable></term>
<listitem>
...
...
@@ -84,7 +94,9 @@ DROP SEQUENCE serial;
<para>
<command>DROP SEQUENCE</command> conforms to the <acronym>SQL</acronym>
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>
</refsect1>
...
...
doc/src/sgml/ref/drop_table.sgml
View file @
daea4d8e
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_table.sgml,v 1.2
2 2005/01/04 00:39:53 tgl
Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_table.sgml,v 1.2
3 2005/11/19 17:39:44 adunstan
Exp $
PostgreSQL documentation
-->
...
...
@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
DROP TABLE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
DROP TABLE
[ IF EXISTS ]
<replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis>
</refsynopsisdiv>
...
...
@@ -48,6 +48,16 @@ DROP TABLE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE |
<title>Parameters</title>
<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>
<term><replaceable class="PARAMETER">name</replaceable></term>
<listitem>
...
...
@@ -97,7 +107,9 @@ DROP TABLE films, distributors;
<para>
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>
</refsect1>
...
...
doc/src/sgml/ref/drop_type.sgml
View file @
daea4d8e
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_type.sgml,v 1.2
6 2004/06/25 21:55:50 tgl
Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_type.sgml,v 1.2
7 2005/11/19 17:39:44 adunstan
Exp $
PostgreSQL documentation
-->
...
...
@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
DROP TYPE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
DROP TYPE
[ IF EXISTS ]
<replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis>
</refsynopsisdiv>
...
...
@@ -37,6 +37,16 @@ DROP TYPE <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE |
<title>Parameters</title>
<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>
<term><replaceable class="PARAMETER">name</replaceable></term>
<listitem>
...
...
@@ -84,7 +94,9 @@ DROP TYPE box;
<para>
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
<productname>PostgreSQL</productname> differ from the SQL standard.
</para>
...
...
doc/src/sgml/ref/drop_view.sgml
View file @
daea4d8e
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_view.sgml,v 1.2
1 2005/01/04 00:39:53 tgl
Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/drop_view.sgml,v 1.2
2 2005/11/19 17:39:44 adunstan
Exp $
PostgreSQL documentation
-->
...
...
@@ -20,7 +20,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
DROP VIEW <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
DROP VIEW
[ IF EXISTS ]
<replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE | RESTRICT ]
</synopsis>
</refsynopsisdiv>
...
...
@@ -37,6 +37,16 @@ DROP VIEW <replaceable class="PARAMETER">name</replaceable> [, ...] [ CASCADE |
<title>Parameters</title>
<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>
<term><replaceable class="PARAMETER">name</replaceable></term>
<listitem>
...
...
@@ -84,7 +94,9 @@ DROP VIEW kinds;
<para>
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>
</refsect1>
...
...
src/backend/commands/conversioncmds.c
View file @
daea4d8e
...
...
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/conversioncmds.c,v 1.2
3 2005/10/15 02:49:15 momji
an Exp $
* $PostgreSQL: pgsql/src/backend/commands/conversioncmds.c,v 1.2
4 2005/11/19 17:39:44 adunst
an Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -98,16 +98,29 @@ CreateConversionCommand(CreateConversionStmt *stmt)
* DROP CONVERSION
*/
void
DropConversionCommand
(
List
*
name
,
DropBehavior
behavior
)
DropConversionCommand
(
List
*
name
,
DropBehavior
behavior
,
bool
missing_ok
)
{
Oid
conversionOid
;
conversionOid
=
FindConversionByName
(
name
);
if
(
!
OidIsValid
(
conversionOid
))
{
if
(
!
missing_ok
)
{
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
);
}
...
...
src/backend/commands/schemacmds.c
View file @
daea4d8e
...
...
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/schemacmds.c,v 1.3
5 2005/10/15 02:49:15 momji
an Exp $
* $PostgreSQL: pgsql/src/backend/commands/schemacmds.c,v 1.3
6 2005/11/19 17:39:44 adunst
an Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -147,7 +147,7 @@ CreateSchemaCommand(CreateSchemaStmt *stmt)
* Removes a schema.
*/
void
RemoveSchema
(
List
*
names
,
DropBehavior
behavior
)
RemoveSchema
(
List
*
names
,
DropBehavior
behavior
,
bool
missing_ok
)
{
char
*
namespaceName
;
Oid
namespaceId
;
...
...
@@ -163,9 +163,22 @@ RemoveSchema(List *names, DropBehavior behavior)
CStringGetDatum
(
namespaceName
),
0
,
0
,
0
);
if
(
!
OidIsValid
(
namespaceId
))
{
if
(
!
missing_ok
)
{
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 */
if
(
!
pg_namespace_ownercheck
(
namespaceId
,
GetUserId
()))
...
...
src/backend/commands/typecmds.c
View file @
daea4d8e
...
...
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.8
2 2005/10/18 01:06:24 tgl
Exp $
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.8
3 2005/11/19 17:39:44 adunstan
Exp $
*
* DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the
...
...
@@ -398,7 +398,7 @@ DefineType(List *names, List *parameters)
* Removes a datatype.
*/
void
RemoveType
(
List
*
names
,
DropBehavior
behavior
)
RemoveType
(
List
*
names
,
DropBehavior
behavior
,
bool
missing_ok
)
{
TypeName
*
typename
;
Oid
typeoid
;
...
...
@@ -414,10 +414,23 @@ RemoveType(List *names, DropBehavior behavior)
/* Use LookupTypeName here so that shell types can be removed. */
typeoid
=
LookupTypeName
(
typename
);
if
(
!
OidIsValid
(
typeoid
))
{
if
(
!
missing_ok
)
{
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
,
ObjectIdGetDatum
(
typeoid
),
...
...
@@ -779,7 +792,7 @@ DefineDomain(CreateDomainStmt *stmt)
* This is identical to RemoveType except we insist it be a domain.
*/
void
RemoveDomain
(
List
*
names
,
DropBehavior
behavior
)
RemoveDomain
(
List
*
names
,
DropBehavior
behavior
,
bool
missing_ok
)
{
TypeName
*
typename
;
Oid
typeoid
;
...
...
@@ -796,10 +809,23 @@ RemoveDomain(List *names, DropBehavior behavior)
/* Use LookupTypeName here so that shell types can be removed. */
typeoid
=
LookupTypeName
(
typename
);
if
(
!
OidIsValid
(
typeoid
))
{
if
(
!
missing_ok
)
{
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
,
ObjectIdGetDatum
(
typeoid
),
...
...
src/backend/parser/gram.y
View file @
daea4d8e
...
...
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.51
2 2005/11/13 19:11:28 tgl
Exp $
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.51
3 2005/11/19 17:39:44 adunstan
Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
...
...
@@ -362,7 +362,7 @@ static void doNegateFloat(Value *v);
HANDLER HAVING HEADER HOLD HOUR_P
ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT
I
F_P I
LIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT
INDEX INHERIT INHERITS INITIALLY INNER_P INOUT INPUT_P
INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT
INTERVAL INTO INVOKER IS ISNULL ISOLATION
...
...
@@ -2818,20 +2818,32 @@ DropOpClassStmt:
*
* 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);
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->behavior = $4;
$$ = (Node *)n;
}
;
drop_type: TABLE { $$ = OBJECT_TABLE; }
| SEQUENCE { $$ = OBJECT_SEQUENCE; }
| VIEW { $$ = OBJECT_VIEW; }
...
...
@@ -8159,6 +8171,7 @@ unreserved_keyword:
| HEADER
| HOLD
| HOUR_P
| IF_P
| IMMEDIATE
| IMMUTABLE
| IMPLICIT_P
...
...
src/backend/parser/keywords.c
View file @
daea4d8e
...
...
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.16
6 2005/10/15 02:49:22 momji
an Exp $
* $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.16
7 2005/11/19 17:39:44 adunst
an Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -160,6 +160,7 @@ static const ScanKeyword ScanKeywords[] = {
{
"header"
,
HEADER
},
{
"hold"
,
HOLD
},
{
"hour"
,
HOUR_P
},
{
"if"
,
IF_P
},
{
"ilike"
,
ILIKE
},
{
"immediate"
,
IMMEDIATE
},
{
"immutable"
,
IMMUTABLE
},
...
...
src/backend/tcop/utility.c
View file @
daea4d8e
...
...
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.24
5 2005/10/15 02:49:27 momji
an Exp $
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.24
6 2005/11/19 17:39:45 adunst
an Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -67,6 +67,7 @@ struct msgstrings
char
kind
;
int
nonexistent_code
;
const
char
*
nonexistent_msg
;
const
char
*
skipping_msg
;
const
char
*
nota_msg
;
const
char
*
drophint_msg
;
};
...
...
@@ -75,26 +76,31 @@ static const struct msgstrings msgstringarray[] = {
{
RELKIND_RELATION
,
ERRCODE_UNDEFINED_TABLE
,
gettext_noop
(
"table
\"
%s
\"
does not exist"
),
gettext_noop
(
"table
\"
%s
\"
does not exist, skipping"
),
gettext_noop
(
"
\"
%s
\"
is not a table"
),
gettext_noop
(
"Use DROP TABLE to remove a table."
)},
{
RELKIND_SEQUENCE
,
ERRCODE_UNDEFINED_TABLE
,
gettext_noop
(
"sequence
\"
%s
\"
does not exist"
),
gettext_noop
(
"sequence
\"
%s
\"
does not exist, skipping"
),
gettext_noop
(
"
\"
%s
\"
is not a sequence"
),
gettext_noop
(
"Use DROP SEQUENCE to remove a sequence."
)},
{
RELKIND_VIEW
,
ERRCODE_UNDEFINED_TABLE
,
gettext_noop
(
"view
\"
%s
\"
does not exist"
),
gettext_noop
(
"view
\"
%s
\"
does not exist, skipping"
),
gettext_noop
(
"
\"
%s
\"
is not a view"
),
gettext_noop
(
"Use DROP VIEW to remove a view."
)},
{
RELKIND_INDEX
,
ERRCODE_UNDEFINED_OBJECT
,
gettext_noop
(
"index
\"
%s
\"
does not exist"
),
gettext_noop
(
"index
\"
%s
\"
does not exist, skipping"
),
gettext_noop
(
"
\"
%s
\"
is not an index"
),
gettext_noop
(
"Use DROP INDEX to remove an index."
)},
{
RELKIND_COMPOSITE_TYPE
,
ERRCODE_UNDEFINED_OBJECT
,
gettext_noop
(
"type
\"
%s
\"
does not exist"
),
gettext_noop
(
"type
\"
%s
\"
does not exist, skipping"
),
gettext_noop
(
"
\"
%s
\"
is not a type"
),
gettext_noop
(
"Use DROP TYPE to remove a type."
)},
{
'\0'
,
0
,
NULL
,
NULL
,
NULL
}
...
...
@@ -132,23 +138,40 @@ DropErrorMsgWrongType(char *relname, char wrongkind, char rightkind)
* non-existent relation
*/
static
void
DropErrorMsgNonExistent
(
RangeVar
*
rel
,
char
rightkind
)
DropErrorMsgNonExistent
(
RangeVar
*
rel
,
char
rightkind
,
bool
missing_ok
)
{
const
struct
msgstrings
*
rentry
;
for
(
rentry
=
msgstringarray
;
rentry
->
kind
!=
'\0'
;
rentry
++
)
{
if
(
rentry
->
kind
==
rightkind
)
{
if
(
!
missing_ok
)
{
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
;
HeapTuple
tuple
;
...
...
@@ -156,7 +179,10 @@ CheckDropPermissions(RangeVar *rel, char rightkind)
relOid
=
RangeVarGetRelid
(
rel
,
true
);
if
(
!
OidIsValid
(
relOid
))
DropErrorMsgNonExistent
(
rel
,
rightkind
);
{
DropErrorMsgNonExistent
(
rel
,
rightkind
,
missing_ok
);
return
false
;
}
tuple
=
SearchSysCache
(
RELOID
,
ObjectIdGetDatum
(
relOid
),
...
...
@@ -183,6 +209,8 @@ CheckDropPermissions(RangeVar *rel, char rightkind)
rel
->
relname
)));
ReleaseSysCache
(
tuple
);
return
true
;
}
/*
...
...
@@ -528,31 +556,36 @@ ProcessUtility(Node *parsetree,
{
case
OBJECT_TABLE
:
rel
=
makeRangeVarFromNameList
(
names
);
CheckDropPermissions
(
rel
,
RELKIND_RELATION
);
if
(
CheckDropPermissions
(
rel
,
RELKIND_RELATION
,
stmt
->
missing_ok
))
RemoveRelation
(
rel
,
stmt
->
behavior
);
break
;
case
OBJECT_SEQUENCE
:
rel
=
makeRangeVarFromNameList
(
names
);
CheckDropPermissions
(
rel
,
RELKIND_SEQUENCE
);
if
(
CheckDropPermissions
(
rel
,
RELKIND_SEQUENCE
,
stmt
->
missing_ok
))
RemoveRelation
(
rel
,
stmt
->
behavior
);
break
;
case
OBJECT_VIEW
:
rel
=
makeRangeVarFromNameList
(
names
);
CheckDropPermissions
(
rel
,
RELKIND_VIEW
);
if
(
CheckDropPermissions
(
rel
,
RELKIND_VIEW
,
stmt
->
missing_ok
))
RemoveView
(
rel
,
stmt
->
behavior
);
break
;
case
OBJECT_INDEX
:
rel
=
makeRangeVarFromNameList
(
names
);
CheckDropPermissions
(
rel
,
RELKIND_INDEX
);
if
(
CheckDropPermissions
(
rel
,
RELKIND_INDEX
,
stmt
->
missing_ok
))
RemoveIndex
(
rel
,
stmt
->
behavior
);
break
;
case
OBJECT_TYPE
:
/* RemoveType does its own permissions checks */
RemoveType
(
names
,
stmt
->
behavior
);
RemoveType
(
names
,
stmt
->
behavior
,
stmt
->
missing_ok
);
break
;
case
OBJECT_DOMAIN
:
...
...
@@ -560,11 +593,13 @@ ProcessUtility(Node *parsetree,
/*
* RemoveDomain does its own permissions checks
*/
RemoveDomain
(
names
,
stmt
->
behavior
);
RemoveDomain
(
names
,
stmt
->
behavior
,
stmt
->
missing_ok
);
break
;
case
OBJECT_CONVERSION
:
DropConversionCommand
(
names
,
stmt
->
behavior
);
DropConversionCommand
(
names
,
stmt
->
behavior
,
stmt
->
missing_ok
);
break
;
case
OBJECT_SCHEMA
:
...
...
@@ -572,7 +607,8 @@ ProcessUtility(Node *parsetree,
/*
* RemoveSchema does its own permissions checks
*/
RemoveSchema
(
names
,
stmt
->
behavior
);
RemoveSchema
(
names
,
stmt
->
behavior
,
stmt
->
missing_ok
);
break
;
default:
...
...
src/include/commands/conversioncmds.h
View file @
daea4d8e
...
...
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/commands/conversioncmds.h,v 1.1
0 2005/06/28 05:09:12 tgl
Exp $
* $PostgreSQL: pgsql/src/include/commands/conversioncmds.h,v 1.1
1 2005/11/19 17:39:45 adunstan
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -18,7 +18,8 @@
#include "nodes/parsenodes.h"
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
AlterConversionOwner
(
List
*
name
,
Oid
newOwnerId
);
...
...
src/include/commands/schemacmds.h
View file @
daea4d8e
...
...
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/commands/schemacmds.h,v 1.1
0 2005/06/28 05:09:12 tgl
Exp $
* $PostgreSQL: pgsql/src/include/commands/schemacmds.h,v 1.1
1 2005/11/19 17:39:45 adunstan
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -19,7 +19,7 @@
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
RenameSchema
(
const
char
*
oldname
,
const
char
*
newname
);
...
...
src/include/commands/typecmds.h
View file @
daea4d8e
...
...
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/commands/typecmds.h,v 1.1
4 2005/10/15 02:49:44 momji
an Exp $
* $PostgreSQL: pgsql/src/include/commands/typecmds.h,v 1.1
5 2005/11/19 17:39:45 adunst
an Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -20,10 +20,10 @@
#define DEFAULT_TYPDELIM ','
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
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
void
AlterDomainDefault
(
List
*
names
,
Node
*
defaultRaw
);
...
...
src/include/nodes/parsenodes.h
View file @
daea4d8e
...
...
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.29
2 2005/10/26 19:21:55 tgl
Exp $
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.29
3 2005/11/19 17:39:45 adunstan
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -1278,6 +1278,7 @@ typedef struct DropStmt
List
*
objects
;
/* list of sublists of names (as Values) */
ObjectType
removeType
;
/* object type */
DropBehavior
behavior
;
/* RESTRICT or CASCADE behavior */
bool
missing_ok
;
/* skip error if object is missing? */
}
DropStmt
;
/* ----------------------
...
...
src/test/regress/expected/drop_if_exists.out
0 → 100644
View file @
daea4d8e
--
-- 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
src/test/regress/parallel_schedule
View file @
daea4d8e
...
...
@@ -38,7 +38,7 @@ test: copy
# ----------
# 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
test: create_index create_view
...
...
src/test/regress/serial_schedule
View file @
daea4d8e
# $PostgreSQL: pgsql/src/test/regress/serial_schedule,v 1.2
8 2005/07/07 20:40:01 tgl
Exp $
# $PostgreSQL: pgsql/src/test/regress/serial_schedule,v 1.2
9 2005/11/19 17:39:45 adunstan
Exp $
# This should probably be in an order similar to parallel_schedule.
test: boolean
test: char
...
...
@@ -49,6 +49,7 @@ test: create_misc
test: create_aggregate
test: create_operator
test: create_index
test: drop_if_exists
test: inherit
test: vacuum
test: create_view
...
...
src/test/regress/sql/drop_if_exists.sql
0 → 100644
View file @
daea4d8e
--
-- 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
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment