Skip to content

Commit

Permalink
solution for issue #150 - oracle index, checkin array
Browse files Browse the repository at this point in the history
  • Loading branch information
xnuinside committed Jul 9, 2022
1 parent 60bdd5d commit 993aa0f
Show file tree
Hide file tree
Showing 7 changed files with 401 additions and 237 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
**v0.27.0**

Fixes:
1. Fixed parsing CHECKS with IN statement - https://github.com/xnuinside/simple-ddl-parser/issues/150


Improvements:

1. Added support for '*' in size column (ORACLE dialect) - https://github.com/xnuinside/simple-ddl-parser/issues/151

New features:
1. Added support for ORACLE 'ORGANIZATION INDEX'



**v0.26.5**
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@ In output you will have names like 'dbo' and 'TO_Requests', not '[dbo]' and '[TO
- 'max' specifier in column size
- CONSTRAINT ... UNIQUE, CONSTRAINT ... CHECK, CONSTRAINT ... FOREIGN KEY, CONSTRAINT ... PRIMARY KEY
- CREATE CLUSTERED INDEX
- CREATE TABLE (...) ORGANIZATION INDEX

### Oracle

Expand Down
5 changes: 5 additions & 0 deletions simple_ddl_parser/dialects/oracle.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,8 @@ def p_expr_storage(self, p):
p_list = list(p)
p[0] = p[1]
p[0]["storage"] = p_list[-1]

def p_expr_index(self, p):
"""expr : expr ID INDEX"""
p[0] = p[1]
p[0][f"{p[2].lower()}_index"] = True
3 changes: 2 additions & 1 deletion simple_ddl_parser/dialects/sql.py
Original file line number Diff line number Diff line change
Expand Up @@ -1191,14 +1191,15 @@ def p_check_st(self, p: List) -> None:
| check_st LP pid RP
"""
p_list = remove_par(list(p))

if isinstance(p[1], dict):
p[0] = p[1]
else:
p[0] = {"check": []}
for item in p_list[2:]:
if isinstance(p_list[-1], dict) and p_list[-1].get("args"):
p[0]["check"][-1] += p_list[-1]["args"]
elif isinstance(item, list):
p[0]["check"].append(f"({','.join(item)})")
else:
p[0]["check"].append(item)

Expand Down
471 changes: 236 additions & 235 deletions simple_ddl_parser/parsetab.py

Large diffs are not rendered by default.

74 changes: 74 additions & 0 deletions tests/dialects/test_oracle.py
Original file line number Diff line number Diff line change
Expand Up @@ -640,3 +640,77 @@ def test_star_in_columns_siize():
'tablespace': None}],
'types': []}
assert expected == result


def test_organization_index():
expected = {'ddl_properties': [],
'domains': [],
'schemas': [],
'sequences': [],
'tables': [{'alter': {},
'checks': [],
'columns': [{'check': None,
'default': None,
'name': 'parent_criterion_id',
'nullable': False,
'references': None,
'size': 3,
'type': 'NUMBER',
'unique': False},
{'check': None,
'default': None,
'name': 'child_criterion_id',
'nullable': False,
'references': None,
'size': 3,
'type': 'NUMBER',
'unique': False},
{'check': 'constraint_name statement',
'default': None,
'name': 'include_exclude_ind',
'nullable': False,
'references': None,
'size': 1,
'type': 'CHAR',
'unique': False}],
'constraints': {'primary_keys': [{'columns': ['parent_criterion_id',
'child_criterion_id'],
'constraint_name': 'pk_meta_criteria_combo'}],
'references': [{'columns': [None],
'constraint_name': 'fk_metacritcombo_parent',
'deferrable_initially': None,
'on_delete': 'CASCADE',
'on_update': None,
'schema': None,
'table': 'meta_criteria'},
{'columns': [None],
'constraint_name': 'fk_metacritcombo_child',
'deferrable_initially': None,
'on_delete': None,
'on_update': None,
'schema': None,
'table': 'meta_criteria'}]},
'index': [],
'organization_index': True,
'partitioned_by': [],
'primary_key': ['parent_criterion_id', 'child_criterion_id'],
'schema': None,
'table_name': 'meta_criteria_combo',
'tablespace': None}],
'types': []}
ddl = """
CREATE TABLE meta_criteria_combo
(
parent_criterion_id NUMBER(3),
child_criterion_id NUMBER(3),
include_exclude_ind CHAR(1) NOT NULL CONSTRAINT chk_metalistcombo_logicalopr CHECK (include_exclude_ind IN ('I', 'E')),
CONSTRAINT pk_meta_criteria_combo PRIMARY KEY(parent_criterion_id, child_criterion_id),
CONSTRAINT fk_metacritcombo_parent FOREIGN KEY(parent_criterion_id) REFERENCES meta_criteria ON DELETE CASCADE,
CONSTRAINT fk_metacritcombo_child FOREIGN KEY(child_criterion_id) REFERENCES meta_criteria
) ORGANIZATION INDEX;
GRANT SELECT ON meta_criteria_combo TO PUBLIC;
"""
result = DDLParser(ddl).run(group_by_type=True)

assert result == expected
77 changes: 76 additions & 1 deletion tests/test_checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def test_in_clause_in_check():
"unique": False,
},
{
"check": "`col_name` IN ('year', 'month')",
"check": "`col_name` IN ('year','month')",
"default": None,
"name": "`col_name`",
"nullable": True,
Expand All @@ -66,3 +66,78 @@ def test_in_clause_in_check():
}
]
assert result == expected


def test_checks_with_in_works():


ddl = """
CREATE TABLE meta_criteria_combo
(
parent_criterion_id NUMBER(3),
child_criterion_id NUMBER(3),
include_exclude_ind CHAR(1) NOT NULL CONSTRAINT chk_metalistcombo_logicalopr CHECK (include_exclude_ind IN ('I', 'E')),
CONSTRAINT pk_meta_criteria_combo PRIMARY KEY(parent_criterion_id, child_criterion_id),
CONSTRAINT fk_metacritcombo_parent FOREIGN KEY(parent_criterion_id) REFERENCES meta_criteria ON DELETE CASCADE,
CONSTRAINT fk_metacritcombo_child FOREIGN KEY(child_criterion_id) REFERENCES meta_criteria
);
"""
result = DDLParser(ddl).run(group_by_type=True)
expected = {'ddl_properties': [],
'domains': [],
'schemas': [],
'sequences': [],
'tables': [{'alter': {},
'checks': [],
'columns': [{'check': None,
'default': None,
'name': 'parent_criterion_id',
'nullable': False,
'references': None,
'size': 3,
'type': 'NUMBER',
'unique': False},
{'check': None,
'default': None,
'name': 'child_criterion_id',
'nullable': False,
'references': None,
'size': 3,
'type': 'NUMBER',
'unique': False},
{'check': 'constraint_name statement',
'default': None,
'name': 'include_exclude_ind',
'nullable': False,
'references': None,
'size': 1,
'type': 'CHAR',
'unique': False}],
'constraints': {'primary_keys': [{'columns': ['parent_criterion_id',
'child_criterion_id'],
'constraint_name': 'pk_meta_criteria_combo'}],
'references': [{'columns': [None],
'constraint_name': 'fk_metacritcombo_parent',
'deferrable_initially': None,
'on_delete': 'CASCADE',
'on_update': None,
'schema': None,
'table': 'meta_criteria'},
{'columns': [None],
'constraint_name': 'fk_metacritcombo_child',
'deferrable_initially': None,
'on_delete': None,
'on_update': None,
'schema': None,
'table': 'meta_criteria'}]},
'index': [],
'partitioned_by': [],
'primary_key': ['parent_criterion_id', 'child_criterion_id'],
'schema': None,
'table_name': 'meta_criteria_combo',
'tablespace': None}],
'types': []}

assert result == expected


0 comments on commit 993aa0f

Please sign in to comment.