Releases: xnuinside/simple-ddl-parser
1.13.0 - Huge bug fixies release
[1.13.0] - 2026-03-29
Added
- None.
Changed
- None.
Fixed
- HQL/Spark SQL nested complex types like
ARRAY<STRUCT<... COMMENT '...'>now parse correctly when innerSTRUCTfields includeCOMMENT '...', instead of failing in strict mode. #137 - MySQL dump-style DDL files now parse more reliably:
DROP TABLE IF EXISTSis supported in parser output and no longer fails in strict mode, inline/*...*/comment placeholders inside identifiers are handled, and table-levelKEY/UNIQUE KEYdefinitions with prefix lengths likecolumn(32)are supported. #148 - MySQL-style
ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY constraint_name (...) REFERENCES ...statements now parse correctly instead of failing on the duplicated foreign key name.ALTER TABLE ... DROP FOREIGN KEY ...is also supported, and simpleDROP VIEW/CREATE VIEW ... AS ...statements are now recognized in parser output. #149 - HQL primitive generic array types like
array<string>now parse without failing on the closing>token. #192 TRUNCATE TABLE schema.tablestatements now return the affected table in parser output instead of being skipped. #190- Mixed SQLite/MySQL dump files now ignore wrapper/admin statements such as
PRAGMA,BEGIN TRANSACTION,LOCK/UNLOCK TABLES, andCREATE/DROP USERinstead of failing in strict mode.DROP DATABASE [IF EXISTS]is now parsed as its own output statement, and MySQLALTER TABLE ... AUTO_INCREMENT = ...updates table output plusalter["auto_increments"]. #146 - MySQL issue-style upgrade scripts now parse
ALTER TABLE ... DEFAULT CHARACTER SET ... COLLATE ...without failing in strict mode, and MySQLALTER TABLE ... CHANGE old_col new_col type ...applies modified column metadata in parser output. #145 - PostgreSQL/Greenplum-style
PARTITION BY ... (PARTITION ... VALUES(...) WITH (...))table definitions no longer return an empty result when partition definitions followPARTITION BY. #118
1.12.0 Bug Fixies & CREATE AS SELECT statement support
[1.12.0] - 2026-03-27
Added
- Support for
CREATE TABLE ... AS SELECT ... FROM source_tablewhen the referenced source table exists in the same DDL input. #216
Changed
- Expanded README coverage for supported parser features, including the same-DDL
CREATE TABLE ... AS SELECT ...limitation and recently added dialect features.
Fixed
- PostgreSQL
GENERATED ALWAYS AS IDENTITY(...)column definitions now parse with identity options likeINCREMENT BYandNO CYCLE. #257 - PostgreSQL
GENERATED ALWAYS AS (...) STOREDnow parses complexCASEexpressions with regex/casts and nested function calls (for example~ '^\d+$'::textwithlpad(...)). #267 (Fix #267) - MySQL table-level
UNIQUE constraint_name (...)definitions now parse without requiring theKEYkeyword. #262 - MSSQL column definitions now support
PRIMARY KEY IDENTITY(1,1)whenIDENTITYappears afterPRIMARY KEY. #261 - HQL/Athena quoted column names in backticks now parse correctly when the identifier contains spaces. #238
1.10.0 - Custom output schema support (built-in BigQuery schema)
[1.10.0] - 2026-01-27
Added
- Custom output schema support with built-in BigQuery schema conversion and a custom schema registry.
- Tests for BigQuery custom schema output and user-registered schemas.
- CLI support for
custom_output_schema. - Examples directory with Python usage samples, documented in the README.
- Tox as a development dependency.
- BigQuery custom schema usage example.
Changed
- Custom output schema
bigquerynow defaults the output mode to BigQuery for dialect-specific parsing. - Tox linting configuration now skips the local
.venvdirectory.
Fixed
- MySQL parsing for
FOREIGN KEYconstraints withON DELETE SET NULLin multi-table DDL. #290 - Preserved column-level reference handling for SET actions while supporting SET NULL constraints.
1.9.0 - Bug fixies & improvements release
1.8.0 - added support for Informix/GBase 8s dialect
Important
- Python 3.7 and 3.8 support is deprecated. Minimum supported version is now Python 3.9.
Improvements
- Added support for Python 3.13.
- Added tox configuration for testing across multiple Python versions (3.9-3.13).
New Features
- Added support for COMMENT ON syntax (TABLE, COLUMN, SCHEMA, DATABASE) - #301
- Added support for Informix/GBase 8s dialect - #299
- Informix data types: SERIAL, SERIAL8, BIGSERIAL, INT8, LVARCHAR, TEXT, BYTE, BLOB, CLOB, MONEY, NCHAR, NVARCHAR
- DATETIME YEAR TO SECOND/FRACTION/DAY syntax
- INTERVAL HOUR TO MINUTE/DAY TO DAY/YEAR TO MONTH syntax
- DEFAULT with Informix functions (TODAY, CURRENT, USER)
- Storage options: IN dbspace, EXTENT SIZE, NEXT SIZE, LOCK MODE
- GBase 8s Oracle-compatible types: VARCHAR2, NVARCHAR2, NUMBER
- GBase 8s virtual columns: column AS (expression), GENERATED ALWAYS AS (expression)
Fixes
- Fixed Snowflake sequence NEXTVAL in column default value - #295
- Fixed escape sequence handling for '=' in generated column expressions.
- Added support for ALTER TABLE with multiple column operations (ADD, DROP, MODIFY) - #300
- Multiple ADD/DROP/MODIFY operations in a single ALTER statement (comma-separated)
- ADD COLUMN syntax (with COLUMN keyword)
- DROP without COLUMN keyword (Oracle style)
- Note:
dropped_columnsandmodified_columnsin output are now lists instead of single dicts
- Fixed BigQuery OPTIONS parsing with unicode characters (em-dash, etc.) - #298
- String literals now support any unicode characters in descriptions
Added Athena as output mode, refactoring & better support for '\\' strings
IMPORTANT:
In this versions there is some output changes & fixes that can break your code.
-
Now all arguments inside brackets are parsed as separate strings in the list.
For example:
file_format = (TYPE=JSON NULL_IF=('field')this was parsed like 'NULL_IF': "('field')",
now it will be: 'NULL_IF': ["'field'"], -
Added separate tokens for EQ
=and IN (previously they was parsed as IDs also - for internal info, for contributors. -
Some check statements in columns now parsed validly, also IN statements parsed as normal lists.
So this statement include_exclude_ind CHAR(1) NOT NULL CONSTRAINT chk_metalistcombo_logicalopr
CHECK (include_exclude_ind IN ('I', 'E')),
will produce this output:
{'check': {'constraint_name': 'chk_metalistcombo_logicalopr',
'statement': {'in_statement': {'in': ["'I'", "'E'"],
'name': 'include_exclude_ind'}}},
Fixes
- DEFAULT word now is not arriving in key 'default' (it was before in some cases)
New Features
- Added Athena output mode and initial support - #272
1.5.0 fix uniques in case of indexes / unique case for several columns
v1.4.0 ⭕ Oracle new output keywords - is_global & temp
Fixes
🔍 BigQuery:
- Indexes without schema causes issues in BigQuery dialect - fixed.
Improvements
⭕ Oracle:
- Added new output keywords in table definition -
temp&is_global. Added support for create global temporary table - #182
1.3.0 🐘 PostgreSQL WITH TIME ZONE & 🔍 BigQuery PARTITION BY Improvements
Fixes
🐘 PostgreSQL:
- Timezone was moved out from type definition to keyword 'with_time_zone' it can be True (if with time zone) or False (if without)
🔍 BigQuery:
- Previously Range in RANGE_BUCKETS was parsed as a columns, now this behaviour is changed and
range placed in own keyword - 'range' (can be array or str).
Also for all ``*_TRUNC PARTITIONS` like DATETIME_TRUNC, TIMESTAMP_TRUNC, etc, second argument moved to arg 'trunc_by'
Improvements
🐘 PostgreSQL:
- Added support for PostgreSQL with / without time zone - #250
🔍 BigQuery:
- Added support for GENERATE_ARRAY in RANGE_BUCKETS #183
1.2.1 MySQL 🐬 & ⭕ Oracle & 🐘 PostgreSQL updates
Fixes
🐬 MySQL:
- Fixed issue relative to auto_increment that caused empty output if auto_increment defined in table properties -
#206
Improvements
🐬 MySQL:
- auto_increment added as property to mysql output
⭕ Oracle:
- Added support for constraint name in column definition - #203
- Added support for GENERATED (ALWAYS | (BY DEFAULT [ON NULL])) AS IDENTITY in column definition
🐘 PostgreSQL:
- Added support for CAST statement in column GENERATE ALWAYS expression - #198