6.0.0 - 2025-10-31
- #550: Create the
StatementInfoclass - #549: Add
leftOperand,operatorandrightOperandproperties to theConditioncomponent
- Add native type declarations
- #365: Change
Componentabstract class to an interface - #368: Rename class members to use camel case format
- #384: Change
Context::load()error handling from throwing an exception to returning a boolean value - #454: Move
Misc::getAliases()intoSelectStatement::getAliases() - #480: Split up Context::escape()
- #470: Restrict parameter type of
OptionsArray::merge - #483: Split build into buildAll
- #505: Change some static properties into class constants
- #504: Change
TokensListclass to add thebuildFromArraymethod - #507: Replace the
Token::TYPE_*constants with theTokenTypeenum - #543: Extract
parsemethod from components into Parsers
- Drop support for PHP 7.2, 7.3, 7.4, 8.0 and 8.1
- #471: Drop
USE_UTF_STRINGSconstant - #482: Drop
$optionsparameter fromComponent::build - #585: Drop
Utils\Routineclass - #594: Remove alternative executable files
5.11.1 - 2025-07-20
- Add context files for MySQL 9.2, MySQL 9.3 and MariaDB 12.1 (#628)
- Add context files for MariaDB 11.8 and MariaDB 12.0 (#620)
- Fix Window function handling that failed because of "OVER" keyword case-sensitive comparison (#623)
5.11.0 - 2025-02-22
- Add Translator::setLocale() method (#599)
- Fix FORCE INDEX not been parsed correctly (#614)
- Fix parsing of ADD UNIQUE and ADD UNIQUE KEY for ALTER TABLE statements (#611)
5.10.3 - 2025-01-18
- Add "RECURSIVE" on build() for "WITH RECURSIVE" on the WithStatement class (#605)
- Fix for quadratic complexity in certain queries, which could have caused long execution times. Thanks to Maximilian Krög (GitHub user MoonE) for this fix to help improve security.
5.10.2 - 2024-12-05
- Add MariaDb 11.6 and 11.7 contexts (#601)
- Add context files for MySQL 9.1 (#603)
5.10.1 - 2024-11-10
- Fix parsing of ALTER TABLE … RENAME KEY (#580)
- Fix parsing table names that start with "e1" (#578)
- Improve handling of negative and overflowed offsets on TokensList (#582)
- Fix parsing of queries with 'AND' (#590)
- Fix C style comments with two asterisks (#597)
- Fix parsing of SRID in column definition (#595)
5.10.0 - 2024-08-29
- Fix parsing of UPDATE ... SET (#577)
- Fix parsing of WITH PARSER (#563)
- Fix context files for MySQL and MariaDB (#572) (#576)
- Allow using
::classkeyword to load a context (#571) - Fix query flags for lower-case functions (#564)
- Improve context files by using constants (#570)
- Fix case when a condition is not parsed correctly (#560)
- Support parsing KILL statements (#556)
- Fix replace clause of select statement with FOR UPDATE (#555)
- Add support for ALTER FUNCTION and ALTER PROCEDURE statements (#553)
5.9.1 - 2024-08-13
- Allow parsing ALTER TABLE statement with column check constraint (#554)
- Add support for PHPUnit 10 (#573)
5.9.0 - 2024-01-20
- Fix keywords not being recognized as table alias (#496)
- Add
bin/sql-parserexecutable file (#517) - Fix bind parameter in LIMIT OFFSET (#498)
- Fix using ? as a parameter (#515)
- Fix a regression with the ALTER operation (#511)
- Fix
:=was not recognized as an operator just like=(#306) - Fix
ALTER TABLE … MODIFY … ENUM('<reserved_keyword>')is being wrongly parsed (#234) - Fix
ALTER TABLE … MODIFY … ENUM('<reserved_keyword>')is being wrongly parsed (#478) - Fix MariaDB window function with alias gives bad linting errors (#283)
- Fix unrecognized keyword
COLLATEinWHEREclauses (#491) - Fix invalid hexadecimal prefix 0X (#508)
- Fix
ALTER EVENT RENAME TOto use expression instead of var (#419) - Fix incorrect order of operations to parse table/db called `` (#422)
- Fix ALTER EVENT statement with DEFINER=user modifier fails to be parsed (#418)
- Fix GROUP BY modifier WITH ROLLUP is treated as a syntax error and prevents export of SQL query results
- Fix
TokensList::getPreviouswas not able to reach very first token (#428) - Fix
TransactionStatement::build()"Call to a member function build() on null" when the transaction has no end - Fix MySQL-specific commands parsing (#226)
- Fix
ALTER TABLE … RENAME COLUMN … TO …is not understood by the parser/linter (#430) - Fix
PARTITIONsyntax errors (#377) - Fix
ALTER USERwhen used withIDENTIFIED WITH/VIA/BYoption (#431) - Fix
COALESCE PARTITIONinALTER TABLE, rather thanCOALESCE(#323) - Support
ALGORITHMandLOCKoptions inALTER TABLEstatements (#319) - Fix way end of functions, procedures and triggers' bodies is identified (#438)
- Fix
enclosed byis not recognized by the parser whenfieldsis in lower case (#236) - Support
KEYonCreateDefinition(#330) - Fix
CALLstatements parsing (#372) - Implement support for
LEFT JOIN,JOIN,INNER JOINonUpdateStatement(#260) - Implement support for
TABLEandREPLACEstatements onDESCRIBEstatements - Fix
DESCRIBEto allow a schema.table syntax (#445) - Fix parsing insert queries with functions trims commas (#450)
- Performance improvement to use less the
nextToken()function (#397) - Lexer - Solving ambiguity on function keywords (#385)
- Implement
ALTER EVENT(#404) - Add
ALTER EVENTkeywords (#404) - Drop PHP 7.1 support
- Fix the alter operation table options
RENAME INDEX x TO y(#405) - Fix
CreateStatementfunction's options (#406) - Fix a PHP notice on Linter using
ANALYZE(#413)
- Add missing return types annotations
- Improve the WITH statements parser (#363)
- Add support for passing
Context::SQL_MODE*constants toContext::setModemethod - Fix additional body tokens issue with
CREATE VIEWstatements (#371) - Exclude from composer vendor bundle /tests and /phpunit.xml.dist
- Support table structure with
COMPRESSEDcolumns (#351) - Add
#[\AllowDynamicProperties]onStatementandExpressionclasses for PHP 8.2 support - Support
ALTERqueries ofPARTITIONS(#329) - Change
Context::load()error handling to returning a boolean value instead of throwing aLoaderException(#384) - Fixed differentiating between
ANALYZEandEXPLAINstatements (#386) - Added "NOT" to the select options (#374)
- Implement the
EXPLAINParser (#389) - Context: Updated contexts to contain
multipointandmultipolygondata types (#393) - Support more keywords on
Expressioncomponent (#399) - Fix PHP 8.3 failing tests (#400)
- Add WITH support (#165, #331)
- Fixed BufferedQuery when it has an odd number of backslashes in the end (#340)
- Fixed the issue that ignored the body tokens when creating views with union (#343)
- Fixed parser errors on "ALTER TABLE" statements to add columns with SET type (#168)
- Fixed PHP 8.1 fatal errors on classes that "implements ArrayAccess"
- Add new contexts for MariaDB 10.4, 10.5, 10.6 (#328)
- Fixed parser errors for "ALTER USER" with options (#342)
- Fixed handling of the procedures and functions's options where part of the body (#339)
- Fix PHP notice "Undefined index: name in src/Components/Key.php#206" for table keys using expressions (#347)
- Added support for MySQL 8.0 table structure KEY expressions (#347)
- Added support for KEY order (ASC/DESC) (#296)
- Added missing KEY options for MySQL and MariaDB (#348)
- Added support for ENFORCED and NOT ENFORCED on table create queries (#341)
- Performance improvement to use less the "ord()" function (#352)
- Added support for OVER() with an alias (AS) (#197)
- Added check for quoted symbol to avoid parser error in case of keyword (#317)
- Allow PHP 8
- Fix array_key_exists warning when parsing a "DEFAULT FALSE" token (#299)
- EXISTS is also a function. (#297)
- Fix lexer to not allow numbers with letters (#300)
- Add support for INVISIBLE keyword (#292)
- Fix the "$" might be a character used in a name (#301)
- Fix use stream_select instead of non-blocking STDIN (#309)
- Add select validation to a create view statement (#310)
- Revert some changes with the understanding of ANSI_QUOTES mode and identifiers
- Suggest motranslator 5.0 in README
- Stop instanciating an object to check its class name. (#290)
- Replace sscanf by equivalent native PHP functions because sscanf can be disabled for security reasons. (#270)
- Allow phpunit 9
- Allow phpmyadmin/motranslator 5.0
- Fix for php error when "INSERT INTO x SET a = 1" is "INSERT INTO x SET = 1" (#295)
- Fixed lexer fails to detect "*" as a wildcard (#288)
- Fixed ANSI_QUOTES support (#284)
- Fixed parser mistakes with comments (#156)
- Fix ALTER TABLE ... PRIMARY/UNIQUE KEY results in error (#267)
- Prevent overwrite of offset in Limit clause by parenthesis (#275)
- Allow SCHEMA to be used in CREATE Database statement (#231)
- Add missing options in SET statement (#255)
- Add support for DROP USER statement (#259)
- Fix php error "undefined index" when replacing a non existing clause (#249)
- Fix for PHP deprecations messages about implode for php 7.4+ (#258)
- Parse CHECK keyword on table definition (#264)
- Parse truncate statement (#221)
- Fix wrong parsing of partitions (#265)
- Drop support for PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, PHP 7.0 and HHVM
- Enable strict mode on PHP files
- Fix redundant whitespaces in build() outputs (#228)
- Fix incorrect error on DEFAULT keyword in ALTER operation (#229)
- Fix incorrect outputs from Query::getClause (#233)
- Add support for reading an SQL file from stdin
- Fix for missing tokenize-query in Composer's vendor/bin/ directory
- Fix for PHP warnings with an incomplete CASE expression (#241)
- Fix for error message with multiple CALL statements (#223)
- Recognize the question mark character as a parameter (#242)
- Fixed BufferedQuery when it has an odd number of backslashes in the end (#340)
- Fixed the issue that ignored the body tokens when creating views with union (#343)
- Fixed parser errors on "ALTER TABLE" statements to add columns with SET type (#168)
- Fixed parser errors for "ALTER USER" with options (#342)
- Fixed handling of the procedures and functions's options where part of the body (#339)
- Fix PHP notice "Undefined index: name in src/Components/Key.php#206" for table keys using functions (#347)
- Fix MySQL 8.0 table structure KEY expression not recognized (#347)
- Fix KEY order (ASC/DESC) not part of the KEY definition (#296)
- Fix missing KEY options for MySQL and MariaDB (#348)
- Fix validation error when using ENFORCED option (#341)
- Added check for quoted symbol to avoid parser error in case of keyword (#317)
- Adjust PHP version constraint to not support PHP 8.0 on the 4.7 series (5.x series supports it)
- Fix array_key_exists warning when parsing a "DEFAULT FALSE" token (#299)
- EXISTS is also a function. (#297)
- Fix lexer to not allow numbers with letters (#300)
- Add support for INVISIBLE keyword (#292)
- Fix the "$" might be a character used in a name (#301)
- Fix use stream_select instead of non-blocking STDIN (#309)
- Add select validation to a create view statement (#310)
- Revert some changes with the understanding of ANSI_QUOTES mode and identifiers
- Suggest motranslator 4.0 in README
- Stop instanciating an object to check its class name. (#290)
- Replace sscanf by equivalent native PHP functions because sscanf can be disabled for security reasons. (#270)
- Allow phpunit 7
- Fix for php error when "INSERT INTO x SET a = 1" is "INSERT INTO x SET = 1" (#295)
- Fixed lexer fails to detect "*" as a wildcard (#288)
- Fixed ANSI_QUOTES support (#284)
- Fixed parser mistakes with comments (#156)
- Fix ALTER TABLE ... PRIMARY/UNIQUE KEY results in error (#267)
- Prevent overwrite of offset in Limit clause by parenthesis (#275)
- Allow SCHEMA to be used in CREATE Database statement (#231)
- Add missing options in SET statement (#255)
- Add support for DROP USER statement (#259)
- Fix php error "undefined index" when replacing a non existing clause (#249)
- Fix for PHP deprecations messages about implode for php 7.4+ (#258)
- Parse CHECK keyword on table definition (#264)
- Parse truncate statement (#221)
- Fix wrong parsing of partitions (#265)
Backport fixes from 5.0.0 to QA branch:
- Fix redundant whitespaces in build() outputs (#228)
- Fix incorrect error on DEFAULT keyword in ALTER operation (#229)
- Fix incorrect outputs from Query::getClause (#233)
- Add support for reading an SQL file from stdin
- Fix for missing tokenize-query in Composer's vendor/bin/ directory
- Fix for PHP warnings with an incomplete CASE expression (#241)
- Fix for error message with multiple CALL statements (#223)
- Recognize the question mark character as a parameter (#242)
- Fixed incorrect error thrown on DEFAULT keyword in ALTER statement (#218)
- Add support for aliases on CASE expressions (#162 and #192)
- Add support for INDEX hints in SELECT statement (#199)
- Add support for LOCK and UNLOCK TABLES statement (#180)
- Add detection of extraneous comma in UPDATE statement (#160)
- Add detection of a missing comma between two ALTER operations (#189)
- Add missing support for STRAIGHT_JOIN (#196)
- Add support for end options in SET statement (#190)
- Fix building of RENAME statements (#201)
- Add support for PURGE statements (#207)
- Add support for COLLATE keyword (#190)
- Fix issue with CREATE OR REPLACE VIEW.
- Fix parsing of CREATE TABLE with per field COLLATE.
- Improved Context::loadClosest to better deal with corner cases.
- Localization updates.
- Make mbstring extension optional (though Symfony polyfill).
- Fixed build CREATE TABLE query with PARTITIONS having ENGINE but not VALUES.
- Added support for binding parameters.
- Fixed minor bug in Query::getFlags.
- Localization updates.
- Initial support for MariaDB SQL contexts.
- Add support for MariaDB 10.3 INTERSECT and EXCEPT.
- Use custom LoaderException for context loading errors.
- Various code cleanups.
- Improved error handling of several invalid statements.
- Fixed parsing SQL comment at the end of query.
- Improved handing of non utf-8 strings.
- Added query flag for SET queries.
- Fixed setting combination SQL Modes.
- Fixed building query with GROUP BY clause.
- Fixed invalid lexing of queries with : in strings.
- Properly handle maximal length of delimiter.
- Fixed wrong extract of string tokens with escaped characters.
- Properly handle lowercase begin statement.
- Added support for DELETE ... JOIN clauses.
- Changed BufferedQuery to include comments in output.
- Fixed parsing of inline comments.
- Coding style improvements.
- Chinese localization.
- Improved order validatin for JOIN clauses.
- Improved pretty printing of JOIN clauses.
- Added support for LOAD DATA statements.
- Localization using phpmyadmin/motranslator is now optional.
- Improved testsuite.
- Better handling of non upper cased not reserved keywords.
- Minor performance and coding style improvements.
- Use phpmyadmin/motranslator to localize messages.
- Fixed CLI wrappers for new API.
- Fixed README for new API.
- Added PhpMyAdmin namespace prefix to follow PSR-4.
- Coding style fixes.
- Fixed indentation in HTML formatting.
- Fixed parsing of unterminated variables.
- Improved comments lexing.
- Coding style fixes.
- Properly handle operators AND, NOT, OR, XOR, DIV, MOD
- Fix return value of Formatter.toString() when type is text
- Fix parsing of FIELDS and LINES options in SELECT..INTO
- PHP 7.2 compatibility.
- Better parameter passing to query formatter.
- Improved parsing of UNION queries.
- Recognize BINARY function.
- Fix broken incorrect clause order detection for Joins.
- Add parsing of end options in Select statements.
- Added verification order of SELECT statement clauses.
- Fixed parsing of ON UPDATE option in field definition of TIMESTAMP type with precision
- Fixed parsing of NATURAL JOIN, CROSS JOIN and related joins.
- Fixed parsing of BEGIN/END labels.
- Fixed API regression on DELETE statement
- Added support for CASE expressions
- Support for parsing and building DELETE statement
- Support for parsing subqueries in FROM clause
- No change release to sync GitHub releases with Packagist
- Fix parsing of DEFINER without backquotes
- Fixed escaping HTML entities in HTML formatter
- Fixed escaping of control chars in CLI formatter
- Fix parsing of REPLACE INTO ...
- Fix parsing of INSERT ... ON DUPLICATE KEY UPDATE ...
- Extended testsuite
- Re-enabled PHP 5.3 support
- Fix parsing of INSERT...SELECT and INSERT...SET syntax
- Fix parsing of CREATE TABLE ... PARTITION
- Fix parsing of SET CHARACTER SET, CHARSET, NAMES
- Add Support for 'CREATE TABLE
table_copyLIKEtable
- Add support for FULL OUTER JOIN
- Fix parsing of query with \
- Recognize UNION DISTINCT
- Recognize REGEXP and RLIKE operators
- Add FULLTEXT and SPATIAL keywords
- Properly parse CREATE TABLE [AS] SELECT
- Fix parsing of table with DEFAULT and COMMENT
- Fix parsing DEFAULT value on CREATE
- Fix parsing of ALTER VIEW
- Condition: Allow keyword
INTERVAL.
- Expression: Refactored parsing options.
- Context: Added custom mode that avoids escaping when possible.
- ArrayObj: Handle more complex expressions in arrays.
- BufferedQuery: Backslashes in comments escaped characters in comments.
- Condition: Allow
IFin conditions. - Context: Add
;as operator. - Context: Updated contexts to contain
BITdata type. - CreateStatement: The
DEFAULToption may be an expression. - DescribeStatement: Added
DESCas alias forDESCRIBE. - Expression: Rewrote expression parsing.
- Misc: Added PHPUnit's Code Coverage 3.0 as a dependency.
- Misc: Added support for PHP 5.4 back.
- Misc: Removed dependency to Ctype.
- Misc: Repository transferred from @udan11 to @phpMyAdmin.
- Misc: Updated
.gitignoreto ignorecomposer.lock. - Misc: Updated Composer and Travis configuration for PHP 7 and PHPUnit 5.
- Tools: Documented tags in
ContextGenerator.
- Allow
NULLin expressions. - Downgraded PHPUnit to 4.8. Removed old PHP versions.
- Updated PHPUnit to 5.1 and fixed some of the tests.
- Added
UNION ALLas a type ofUNION. - Expressions are permitted in
SEToperations. - Added
STRAIGHT_JOINas a known type of join. - Added missing definitions for
MATCHandAGAINST. - Added missing statement (
FLUSHandDEALLOCATE).
- Expressions may begin with a function that is also a reserved keyword (e.g.
IF).
- Fixed a bug where formatter split the function name and the parameters list.
- Add GRANT as known statement.
- Use JOIN expressions for flag detection.
- Fix the order of clauses in SELECT statements involving UNIONs.
- Added dummy parsers for CREATE USER and SET PASSWORD statements.
- Accept NOT operator in conditions.
- Fixed DELIMITER statements in BufferedQuery.
- Added INSERT statement builder.
- Fix error message in
SqlParser\Components\OptionsArray.
- Avoid building a field multiple times if clause has synonyms.
- Add EXISTS as an acceptable keyword in conditions.
- Handle backslashes separately for
SqlParser\Utils\BufferedQuery. Fixes a bug where backslashes in combination with strings weren't handled properly.
Breaking changes:
SqlParser\Components\Reference::$tableis now an instance ofSqlParser\Components\Expressionto support references from other tables.
- Add definitions for all JOIN clauses.
- Properly parse options when the value of the option is '='.
- Only RANGE and LIST type partitions support VALUES.
- Added utilities for handling tokens and tokens list.
- Added missing NOT IN operator. This caused troubles when parsing conditions that contained the
NOT INoperator.
- Added support for
OUTERas an optional keyword in joins.
- Fixed a bug related to (sub)partitions options not being included in the built component. Also, the option
ENGINEwas unrecognized.
- Better parsing for CREATE TABLE statements (related to breaking change 1).
- Added support for JSON data type.
- Refactoring and minor documentation improvements.
Breaking changes:
SqlParser\Components\Key::$columnsis now an array of arrays. Each array must contain anamekey which represents the name of the column and an optionallengthkey which represents the length of the column.
- First release of this library.