DBZ-7498 Support Oracle 23 "IF [NOT] EXISTS" clauses for DDL

This commit is contained in:
Chris Cranford 2024-02-16 12:34:18 -05:00 committed by Chris Cranford
parent 626e7bb240
commit 08f0b0c52b
3 changed files with 35 additions and 9 deletions

View File

@ -592,6 +592,7 @@ sequence_start_clause
create_index create_index
: CREATE (UNIQUE | BITMAP)? INDEX index_name : CREATE (UNIQUE | BITMAP)? INDEX index_name
(IF NOT EXISTS)?
ON (cluster_index_clause | table_index_clause | bitmap_join_index_clause) ON (cluster_index_clause | table_index_clause | bitmap_join_index_clause)
UNUSABLE? UNUSABLE?
; ;
@ -863,6 +864,7 @@ new_index_name
create_user create_user
: CREATE USER : CREATE USER
user_object_name user_object_name
(IF NOT EXISTS)?
( identified_by ( identified_by
| identified_other_clause | identified_other_clause
| user_tablespace_clause | user_tablespace_clause
@ -872,7 +874,7 @@ create_user
| user_lock_clause | user_lock_clause
| user_editions_clause | user_editions_clause
| container_clause | container_clause
)+ ';' )+
; ;
// The standard clauses only permit one user per statement. // The standard clauses only permit one user per statement.
@ -897,7 +899,7 @@ alter_user
; ;
drop_user drop_user
: DROP USER user_object_name CASCADE? : DROP USER user_object_name (IF EXISTS)? CASCADE?
; ;
alter_identified_by alter_identified_by
@ -1256,7 +1258,7 @@ sql_statement_shortcut
; ;
drop_index drop_index
: DROP INDEX index_name ';' : DROP INDEX index_name (IF EXISTS)? ';'
; ;
rename_object rename_object
@ -1516,11 +1518,10 @@ create_tablespace
| temporary_tablespace_clause | temporary_tablespace_clause
| undo_tablespace_clause | undo_tablespace_clause
) )
';'
; ;
permanent_tablespace_clause permanent_tablespace_clause
: TABLESPACE id_expression datafile_specification? : TABLESPACE id_expression (IF NOT EXISTS)? datafile_specification?
( MINIMUM EXTENT size_clause ( MINIMUM EXTENT size_clause
| BLOCKSIZE size_clause | BLOCKSIZE size_clause
| logging_clause | logging_clause
@ -1557,12 +1558,14 @@ segment_management_clause
temporary_tablespace_clause temporary_tablespace_clause
: TEMPORARY TABLESPACE tablespace_name=id_expression : TEMPORARY TABLESPACE tablespace_name=id_expression
(IF NOT EXISTS)?
tempfile_specification? tempfile_specification?
tablespace_group_clause? extent_management_clause? tablespace_group_clause? extent_management_clause?
; ;
undo_tablespace_clause undo_tablespace_clause
: UNDO TABLESPACE tablespace_name=id_expression : UNDO TABLESPACE tablespace_name=id_expression
(IF NOT EXISTS)?
datafile_specification? datafile_specification?
extent_management_clause? tablespace_retention_clause? extent_management_clause? tablespace_retention_clause?
; ;
@ -1828,7 +1831,7 @@ create_table
| DUPLICATED | DUPLICATED
| IMMUTABLE? BLOCKCHAIN | IMMUTABLE? BLOCKCHAIN
| IMMUTABLE | IMMUTABLE
)? TABLE tableview_name )? TABLE tableview_name (IF NOT EXISTS)?
(SHARING '=' (NONE | METADATA | DATA | EXTENDED DATA))? (SHARING '=' (NONE | METADATA | DATA | EXTENDED DATA))?
(relational_table | object_table | xmltype_table) (USAGE QUEUE)? (AS select_only_statement)? memoptimize_read_write_clause? (relational_table | object_table | xmltype_table) (USAGE QUEUE)? (AS select_only_statement)? memoptimize_read_write_clause?
; ;
@ -2558,11 +2561,11 @@ truncate_cluster
; ;
drop_table drop_table
: DROP TABLE tableview_name (AS tableview_name)? (CASCADE CONSTRAINTS)? PURGE? (AS quoted_string)? FORCE? : DROP TABLE tableview_name (IF EXISTS)? (AS tableview_name)? (CASCADE CONSTRAINTS)? PURGE? (AS quoted_string)? FORCE?
; ;
drop_tablespace drop_tablespace
: DROP TABLESPACE ts = id_expression ((DROP | KEEP) QUOTA?)? including_contents_clause? : DROP TABLESPACE ts = id_expression (IF EXISTS)? ((DROP | KEEP) QUOTA?)? including_contents_clause?
; ;
drop_tablespace_set drop_tablespace_set
@ -2570,7 +2573,7 @@ drop_tablespace_set
; ;
drop_view drop_view
: DROP VIEW tableview_name (CASCADE CONSTRAINT)? SEMICOLON : DROP VIEW tableview_name (IF EXISTS)? (CASCADE CONSTRAINT)? SEMICOLON
; ;
including_contents_clause including_contents_clause

View File

@ -656,4 +656,13 @@ CREATE IMMUTABLE TABLE t_temp_log(id int, status varchar(10));
CREATE BLOCKCHAIN TABLE t_temp_log(id int, status varchar(10)); CREATE BLOCKCHAIN TABLE t_temp_log(id int, status varchar(10));
CREATE IMMUTABLE BLOCKCHAIN TABLE t_temp_log(id int, status varchar(10)); CREATE IMMUTABLE BLOCKCHAIN TABLE t_temp_log(id int, status varchar(10));
-- Create table (Oracle 23+)
create table debezium.products if not exists (id NUMBER(4) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 101) NOT NULL PRIMARY KEY, name VARCHAR2(255) NOT NULL, description VARCHAR2(512), weight FLOAT);
-- Create index (Oracle 23+)
create index hr.name IF NOT EXISTS on hr.table (id,data) tablespace ts;
-- Create user (Oracle 23+)
CREATE USER debezium IF NOT EXISTS IDENTIFIED BY abc;
-- Create tablespace (Oracle 23+)
CREATE TABLESPACE LOGMINER_TBS IF NOT EXISTS DATAFILE '/opt/oracle/oradata/ORCLCDB/logminer_tbs.dbf' SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
CREATE OR REPLACE NONEDITIONABLE PACKAGE BODY tidy_html_snippet_pkg AS FUNCTION tidy(i_html_snippet IN CLOB) RETURN CLOB; FUNCTION tidy(i_html_snippet IN VARCHAR2) RETURN CLOB; END tidy_html_snippet_pkg; CREATE OR REPLACE NONEDITIONABLE PACKAGE BODY tidy_html_snippet_pkg AS FUNCTION tidy(i_html_snippet IN CLOB) RETURN CLOB; FUNCTION tidy(i_html_snippet IN VARCHAR2) RETURN CLOB; END tidy_html_snippet_pkg;

View File

@ -17,3 +17,17 @@ DROP TABLESPACE SET ts1 INCLUDING CONTENTS;
DROP TABLESPACE SET ts1 INCLUDING CONTENTS CASCADE CONSTRAINTS; DROP TABLESPACE SET ts1 INCLUDING CONTENTS CASCADE CONSTRAINTS;
DROP TABLESPACE SET ts1 INCLUDING CONTENTS AND DATAFILES; DROP TABLESPACE SET ts1 INCLUDING CONTENTS AND DATAFILES;
-- Drop table (Oracle 23+)
DROP TABLE TEST.STUDENT IF EXISTS;
DROP TABLE TEST.STUDENT IF EXISTS CASCADE CONSTRAINTS;
-- Drop user (Oracle 23+)
DROP USER debezium IF EXISTS;
-- Drop tablespace (Oracle 23+)
DROP TABLESPACE tbs_01 IF EXISTS;
DROP TABLESPACE tbs_01 IF EXISTS KEEP QUOTA;
-- Drop index (Oracle 23+)
DROP INDEX index_name IF EXISTS;