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 (UNIQUE | BITMAP)? INDEX index_name
(IF NOT EXISTS)?
ON (cluster_index_clause | table_index_clause | bitmap_join_index_clause)
UNUSABLE?
;
@ -863,6 +864,7 @@ new_index_name
create_user
: CREATE USER
user_object_name
(IF NOT EXISTS)?
( identified_by
| identified_other_clause
| user_tablespace_clause
@ -872,7 +874,7 @@ create_user
| user_lock_clause
| user_editions_clause
| container_clause
)+ ';'
)+
;
// The standard clauses only permit one user per statement.
@ -897,7 +899,7 @@ alter_user
;
drop_user
: DROP USER user_object_name CASCADE?
: DROP USER user_object_name (IF EXISTS)? CASCADE?
;
alter_identified_by
@ -1256,7 +1258,7 @@ sql_statement_shortcut
;
drop_index
: DROP INDEX index_name ';'
: DROP INDEX index_name (IF EXISTS)? ';'
;
rename_object
@ -1516,11 +1518,10 @@ create_tablespace
| temporary_tablespace_clause
| undo_tablespace_clause
)
';'
;
permanent_tablespace_clause
: TABLESPACE id_expression datafile_specification?
: TABLESPACE id_expression (IF NOT EXISTS)? datafile_specification?
( MINIMUM EXTENT size_clause
| BLOCKSIZE size_clause
| logging_clause
@ -1557,12 +1558,14 @@ segment_management_clause
temporary_tablespace_clause
: TEMPORARY TABLESPACE tablespace_name=id_expression
(IF NOT EXISTS)?
tempfile_specification?
tablespace_group_clause? extent_management_clause?
;
undo_tablespace_clause
: UNDO TABLESPACE tablespace_name=id_expression
(IF NOT EXISTS)?
datafile_specification?
extent_management_clause? tablespace_retention_clause?
;
@ -1828,7 +1831,7 @@ create_table
| DUPLICATED
| IMMUTABLE? BLOCKCHAIN
| IMMUTABLE
)? TABLE tableview_name
)? TABLE tableview_name (IF NOT EXISTS)?
(SHARING '=' (NONE | METADATA | DATA | EXTENDED DATA))?
(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 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 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
@ -2570,7 +2573,7 @@ drop_tablespace_set
;
drop_view
: DROP VIEW tableview_name (CASCADE CONSTRAINT)? SEMICOLON
: DROP VIEW tableview_name (IF EXISTS)? (CASCADE CONSTRAINT)? SEMICOLON
;
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 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;

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 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;