diff --git a/libraries/sql-parser/src/Context.php b/libraries/sql-parser/src/Context.php index 2b43e568a1..9102bb2bcb 100644 --- a/libraries/sql-parser/src/Context.php +++ b/libraries/sql-parser/src/Context.php @@ -26,46 +26,70 @@ abstract class Context */ const OPERATOR_MAX_LENGTH = 4; + /** + * The name of the default content. + * + * @var string + */ + public static $defaultContext = '\\SqlParser\\Contexts\\Context_MySQL50700'; + + /** + * The name of the loaded context. + * + * @var string + */ + public static $loadedContext = '\\SqlParser\\Contexts\\Context_MySQL50700'; // ------------------------------------------------------------------------- // Keywords. /** - * List of official keywords. + * List of keywords. * * Because, PHP's associative arrays are basically hash tables, it is more * efficient to store keywords as keys instead of values. * + * There are multiple types of keyword, depending on the value associated: + * 1 - reserved keywords + * 2 - keyword + * 3 - composite keyword (unofficial); used to make the job of the lexer + * much easier by grouping keywords that may appear together + * + * Keywords below are sorted by type, length and keyword. + * * @var array */ public static $KEYWORDS = array( - 'AS' => 1, 'BY' => 1, 'IF' => 1, 'IN' => 1, 'IS' => 1, 'ON' => 1, - 'OR' => 1, 'TO' => 1, - 'ADD' => 1, 'ALL' => 1, 'AND' => 1, 'ASC' => 1, 'DEC' => 1, 'DIV' => 1, - 'FOR' => 1, 'GET' => 1, 'INT' => 1, 'KEY' => 1, 'MOD' => 1, 'NOT' => 1, - 'OUT' => 1, 'SET' => 1, 'SQL' => 1, 'SSL' => 1, 'USE' => 1, 'XOR' => 1, - 'BLOB' => 1, 'BOTH' => 1, 'CALL' => 1, 'CASE' => 1, 'CHAR' => 1, - 'DESC' => 1, 'DROP' => 1, 'DUAL' => 1, 'EACH' => 1, 'ELSE' => 1, - 'EXIT' => 1, 'FROM' => 1, 'GOTO' => 1, 'INT1' => 1, 'INT2' => 1, - 'INT3' => 1, 'INT4' => 1, 'INT8' => 1, 'INTO' => 1, 'JOIN' => 1, - 'KEYS' => 1, 'KILL' => 1, 'LEFT' => 1, 'LIKE' => 1, 'LOAD' => 1, - 'LOCK' => 1, 'LONG' => 1, 'LOOP' => 1, 'NULL' => 1, 'READ' => 1, - 'REAL' => 1, 'SHOW' => 1, 'THEN' => 1, 'TRUE' => 1, 'UNDO' => 1, - 'WHEN' => 1, 'WITH' => 1, - 'ALTER' => 1, 'CHECK' => 1, 'CROSS' => 1, 'FALSE' => 1, 'FETCH' => 1, - 'FLOAT' => 1, 'FORCE' => 1, 'GRANT' => 1, 'GROUP' => 1, 'INDEX' => 1, - 'INNER' => 1, 'INOUT' => 1, 'LABEL' => 1, 'LEAVE' => 1, 'LIMIT' => 1, - 'LINES' => 1, 'MATCH' => 1, 'ORDER' => 1, 'OUTER' => 1, 'PURGE' => 1, - 'RANGE' => 1, 'READS' => 1, 'RIGHT' => 1, 'RLIKE' => 1, 'TABLE' => 1, - 'UNION' => 1, 'USAGE' => 1, 'USING' => 1, 'WHERE' => 1, 'WHILE' => 1, - 'WRITE' => 1, + 'AS' => 1, 'BY' => 1, 'IF' => 1, 'IN' => 1, 'IS' => 1, + 'ON' => 1, 'OR' => 1, 'TO' => 1, + 'ADD' => 1, 'ALL' => 1, 'AND' => 1, 'ASC' => 1, 'DEC' => 1, + 'DIV' => 1, 'FOR' => 1, 'GET' => 1, 'INT' => 1, 'KEY' => 1, + 'MOD' => 1, 'NOT' => 1, 'OUT' => 1, 'SET' => 1, 'SQL' => 1, + 'SSL' => 1, 'USE' => 1, 'XOR' => 1, + 'BLOB' => 1, 'BOTH' => 1, 'CALL' => 1, 'CASE' => 1, + 'CHAR' => 1, 'DESC' => 1, 'DROP' => 1, 'DUAL' => 1, + 'EACH' => 1, 'ELSE' => 1, 'EXIT' => 1, 'FROM' => 1, + 'INT1' => 1, 'INT2' => 1, 'INT3' => 1, 'INT4' => 1, + 'INT8' => 1, 'INTO' => 1, 'JOIN' => 1, 'KEYS' => 1, + 'KILL' => 1, 'LEFT' => 1, 'LIKE' => 1, 'LOAD' => 1, + 'LOCK' => 1, 'LONG' => 1, 'LOOP' => 1, 'NULL' => 1, + 'READ' => 1, 'REAL' => 1, 'SHOW' => 1, 'THEN' => 1, + 'TRUE' => 1, 'UNDO' => 1, 'WHEN' => 1, 'WITH' => 1, + 'ALTER' => 1, 'CHECK' => 1, 'CROSS' => 1, 'FALSE' => 1, + 'FETCH' => 1, 'FLOAT' => 1, 'FORCE' => 1, 'GRANT' => 1, + 'GROUP' => 1, 'INDEX' => 1, 'INNER' => 1, 'INOUT' => 1, + 'LEAVE' => 1, 'LIMIT' => 1, 'LINES' => 1, 'MATCH' => 1, + 'ORDER' => 1, 'OUTER' => 1, 'PURGE' => 1, 'RANGE' => 1, + 'READS' => 1, 'RIGHT' => 1, 'RLIKE' => 1, 'TABLE' => 1, + 'UNION' => 1, 'USAGE' => 1, 'USING' => 1, 'WHERE' => 1, + 'WHILE' => 1, 'WRITE' => 1, 'BEFORE' => 1, 'BIGINT' => 1, 'BINARY' => 1, 'CHANGE' => 1, 'COLUMN' => 1, 'CREATE' => 1, 'CURSOR' => 1, 'DELETE' => 1, 'DOUBLE' => 1, 'ELSEIF' => 1, 'EXISTS' => 1, 'FLOAT4' => 1, 'FLOAT8' => 1, 'HAVING' => 1, 'IGNORE' => 1, 'INFILE' => 1, 'INSERT' => 1, 'LINEAR' => 1, 'OPTION' => 1, 'REGEXP' => 1, 'RENAME' => 1, 'REPEAT' => 1, 'RETURN' => 1, 'REVOKE' => 1, - 'SCHEMA' => 1, 'SELECT' => 1, 'SIGNAL' => 1, 'SONAME' => 1, + 'SCHEMA' => 1, 'SELECT' => 1, 'SIGNAL' => 1, 'STORED' => 1, 'UNIQUE' => 1, 'UNLOCK' => 1, 'UPDATE' => 1, 'VALUES' => 1, 'ANALYZE' => 1, 'BETWEEN' => 1, 'CASCADE' => 1, 'COLLATE' => 1, 'CONVERT' => 1, 'DECIMAL' => 1, 'DECLARE' => 1, 'DEFAULT' => 1, @@ -73,23 +97,27 @@ abstract class Context 'INTEGER' => 1, 'ITERATE' => 1, 'LEADING' => 1, 'NATURAL' => 1, 'NUMERIC' => 1, 'OUTFILE' => 1, 'PRIMARY' => 1, 'RELEASE' => 1, 'REPLACE' => 1, 'REQUIRE' => 1, 'SCHEMAS' => 1, 'SPATIAL' => 1, - 'TINYINT' => 1, 'TRIGGER' => 1, 'UPGRADE' => 1, 'VARCHAR' => 1, - 'VARYING' => 1, - 'CONTINUE' => 1, 'DATABASE' => 1, 'DAY_HOUR' => 1, 'DESCRIBE' => 1, - 'DISTINCT' => 1, 'ENCLOSED' => 1, 'FULLTEXT' => 1, 'INTERVAL' => 1, - 'LONGBLOB' => 1, 'LONGTEXT' => 1, 'MAXVALUE' => 1, 'MODIFIES' => 1, - 'OPTIMIZE' => 1, 'RESIGNAL' => 1, 'RESTRICT' => 1, 'SMALLINT' => 1, - 'SPECIFIC' => 1, 'SQLSTATE' => 1, 'STARTING' => 1, 'TINYBLOB' => 1, - 'TINYTEXT' => 1, 'TRAILING' => 1, 'UNSIGNED' => 1, 'UTC_DATE' => 1, + 'TINYINT' => 1, 'TRIGGER' => 1, 'VARCHAR' => 1, 'VARYING' => 1, + 'VIRTUAL' => 1, + 'CONTINUE' => 1, 'DATABASE' => 1, 'DAY_HOUR' => 1, + 'DESCRIBE' => 1, 'DISTINCT' => 1, 'ENCLOSED' => 1, + 'FULLTEXT' => 1, 'INTERVAL' => 1, 'LONGBLOB' => 1, + 'LONGTEXT' => 1, 'MAXVALUE' => 1, 'MODIFIES' => 1, + 'OPTIMIZE' => 1, 'RESIGNAL' => 1, 'RESTRICT' => 1, + 'SMALLINT' => 1, 'SPECIFIC' => 1, 'SQLSTATE' => 1, + 'STARTING' => 1, 'TINYBLOB' => 1, 'TINYTEXT' => 1, + 'TRAILING' => 1, 'UNSIGNED' => 1, 'UTC_DATE' => 1, 'UTC_TIME' => 1, 'ZEROFILL' => 1, - 'CHARACTER' => 1, 'CONDITION' => 1, 'DATABASES' => 1, 'LOCALTIME' => 1, - 'MEDIUMINT' => 1, 'MIDDLEINT' => 1, 'PARTITION' => 1, 'PRECISION' => 1, - 'PROCEDURE' => 1, 'SENSITIVE' => 1, 'SEPARATOR' => 1, 'VARBINARY' => 1, - 'ACCESSIBLE' => 1, 'ASENSITIVE' => 1, 'CONNECTION' => 1, - 'CONSTRAINT' => 1, 'DAY_MINUTE' => 1, 'DAY_SECOND' => 1, - 'MEDIUMBLOB' => 1, 'MEDIUMTEXT' => 1, 'OPTIONALLY' => 1, - 'READ_WRITE' => 1, 'REFERENCES' => 1, 'SQLWARNING' => 1, - 'TERMINATED' => 1, 'YEAR_MONTH' => 1, + 'CHARACTER' => 1, 'CONDITION' => 1, 'DATABASES' => 1, + 'GENERATED' => 1, 'LOCALTIME' => 1, 'MEDIUMINT' => 1, + 'MIDDLEINT' => 1, 'PARTITION' => 1, 'PRECISION' => 1, + 'PROCEDURE' => 1, 'SENSITIVE' => 1, 'SEPARATOR' => 1, + 'VARBINARY' => 1, + 'ACCESSIBLE' => 1, 'ASENSITIVE' => 1, 'CONSTRAINT' => 1, + 'DAY_MINUTE' => 1, 'DAY_SECOND' => 1, 'MEDIUMBLOB' => 1, + 'MEDIUMTEXT' => 1, 'OPTIONALLY' => 1, 'READ_WRITE' => 1, + 'REFERENCES' => 1, 'SQLWARNING' => 1, 'TERMINATED' => 1, + 'YEAR_MONTH' => 1, 'DISTINCTROW' => 1, 'HOUR_MINUTE' => 1, 'HOUR_SECOND' => 1, 'INSENSITIVE' => 1, 'MASTER_BIND' => 1, 'CURRENT_DATE' => 1, 'CURRENT_TIME' => 1, 'CURRENT_USER' => 1, @@ -105,33 +133,118 @@ abstract class Context 'SQL_CALC_FOUND_ROWS' => 1, 'MASTER_SSL_VERIFY_SERVER_CERT' => 1, - /* - * Secondary group of keywords. - * - * Keywords below are either words that are used as keywords, but not - * defined as proper keywords or are group of keywords which are parsed - * easier when found grouped. - */ + 'AT' => 2, 'DO' => 2, 'IO' => 2, 'NO' => 2, 'XA' => 2, + 'ANY' => 2, 'AVG' => 2, 'BIT' => 2, 'CPU' => 2, 'DAY' => 2, 'END' => 2, + 'IPC' => 2, 'NDB' => 2, 'NEW' => 2, 'ONE' => 2, 'ROW' => 2, 'XID' => 2, + 'XML' => 2, + 'BOOL' => 2, 'BYTE' => 2, 'CODE' => 2, 'CUBE' => 2, 'DATA' => 2, 'DATE' => 2, + 'DISK' => 2, 'ENDS' => 2, 'ENUM' => 2, 'FAST' => 2, 'FILE' => 2, 'FULL' => 2, + 'HASH' => 2, 'HELP' => 2, 'HOST' => 2, 'HOUR' => 2, 'LAST' => 2, 'LESS' => 2, + 'LIST' => 2, 'LOGS' => 2, 'MODE' => 2, 'NAME' => 2, 'NEXT' => 2, 'NONE' => 2, + 'ONLY' => 2, 'OPEN' => 2, 'PAGE' => 2, 'PORT' => 2, 'PREV' => 2, 'ROWS' => 2, + 'SLOW' => 2, 'SOME' => 2, 'STOP' => 2, 'TEXT' => 2, 'THAN' => 2, 'TIME' => 2, + 'TYPE' => 2, 'USER' => 2, 'VIEW' => 2, 'WAIT' => 2, 'WEEK' => 2, 'WORK' => 2, + 'X509' => 2, 'YEAR' => 2, + 'AFTER' => 2, 'ASCII' => 2, 'BEGIN' => 2, 'BLOCK' => 2, 'BTREE' => 2, + 'CACHE' => 2, 'CHAIN' => 2, 'CLOSE' => 2, 'ERROR' => 2, 'EVENT' => 2, + 'EVERY' => 2, 'FIRST' => 2, 'FIXED' => 2, 'FLUSH' => 2, 'FOUND' => 2, + 'HOSTS' => 2, 'LEVEL' => 2, 'LOCAL' => 2, 'LOCKS' => 2, 'MERGE' => 2, + 'MONTH' => 2, 'MUTEX' => 2, 'NAMES' => 2, 'NCHAR' => 2, 'NEVER' => 2, + 'OWNER' => 2, 'PHASE' => 2, 'POINT' => 2, 'PROXY' => 2, 'QUERY' => 2, + 'QUICK' => 2, 'RELAY' => 2, 'RESET' => 2, 'RTREE' => 2, 'SHARE' => 2, + 'SLAVE' => 2, 'START' => 2, 'SUPER' => 2, 'SWAPS' => 2, 'TYPES' => 2, + 'UNTIL' => 2, 'VALUE' => 2, + 'ACTION' => 2, 'ALWAYS' => 2, 'BACKUP' => 2, 'BINLOG' => 2, 'CIPHER' => 2, + 'CLIENT' => 2, 'COMMIT' => 2, 'ENABLE' => 2, 'ENGINE' => 2, 'ERRORS' => 2, + 'ESCAPE' => 2, 'EVENTS' => 2, 'EXPIRE' => 2, 'EXPORT' => 2, 'FAULTS' => 2, + 'FIELDS' => 2, 'FILTER' => 2, 'FORMAT' => 2, 'GLOBAL' => 2, 'GRANTS' => 2, + 'IMPORT' => 2, 'ISSUER' => 2, 'LEAVES' => 2, 'MASTER' => 2, 'MEDIUM' => 2, + 'MEMORY' => 2, 'MINUTE' => 2, 'MODIFY' => 2, 'NUMBER' => 2, 'OFFSET' => 2, + 'PARSER' => 2, 'PLUGIN' => 2, 'RELOAD' => 2, 'REMOVE' => 2, 'REPAIR' => 2, + 'RESUME' => 2, 'ROLLUP' => 2, 'SECOND' => 2, 'SERIAL' => 2, 'SERVER' => 2, + 'SIGNED' => 2, 'SIMPLE' => 2, 'SOCKET' => 2, 'SONAME' => 2, 'SOUNDS' => 2, + 'SOURCE' => 2, 'STARTS' => 2, 'STATUS' => 2, 'STRING' => 2, 'TABLES' => 2, + 'ACCOUNT' => 2, 'AGAINST' => 2, 'ANALYSE' => 2, 'BOOLEAN' => 2, 'CHANGED' => 2, + 'CHANNEL' => 2, 'CHARSET' => 2, 'COLUMNS' => 2, 'COMMENT' => 2, 'COMPACT' => 2, + 'CONTEXT' => 2, 'CURRENT' => 2, 'DEFINER' => 2, 'DISABLE' => 2, 'DISCARD' => 2, + 'DYNAMIC' => 2, 'ENGINES' => 2, 'EXECUTE' => 2, 'FOLLOWS' => 2, 'GENERAL' => 2, + 'HANDLER' => 2, 'INDEXES' => 2, 'INSTALL' => 2, 'INVOKER' => 2, 'LOGFILE' => 2, + 'MIGRATE' => 2, 'NO_WAIT' => 2, 'OPTIONS' => 2, 'PARTIAL' => 2, 'PLUGINS' => 2, + 'POLYGON' => 2, 'PREPARE' => 2, 'PROFILE' => 2, 'QUARTER' => 2, 'REBUILD' => 2, + 'RECOVER' => 2, 'RESTORE' => 2, 'RETURNS' => 2, 'REVERSE' => 2, 'ROUTINE' => 2, + 'SESSION' => 2, 'STACKED' => 2, 'STORAGE' => 2, 'SUBJECT' => 2, 'SUSPEND' => 2, + 'UNICODE' => 2, 'UNKNOWN' => 2, 'UPGRADE' => 2, 'USE_FRM' => 2, 'WITHOUT' => 2, + 'WRAPPER' => 2, + 'CASCADED' => 2, 'CHECKSUM' => 2, 'COALESCE' => 2, 'CONTAINS' => 2, + 'DATAFILE' => 2, 'DATETIME' => 2, 'DUMPFILE' => 2, 'EXCHANGE' => 2, + 'EXTENDED' => 2, 'FUNCTION' => 2, 'GEOMETRY' => 2, 'LANGUAGE' => 2, + 'MAX_ROWS' => 2, 'MAX_SIZE' => 2, 'MIN_ROWS' => 2, 'NATIONAL' => 2, + 'NVARCHAR' => 2, 'PASSWORD' => 2, 'PRECEDES' => 2, 'PRESERVE' => 2, + 'PROFILES' => 2, 'REDOFILE' => 2, 'RELAYLOG' => 2, 'ROLLBACK' => 2, + 'SCHEDULE' => 2, 'SECURITY' => 2, 'SHUTDOWN' => 2, 'SNAPSHOT' => 2, + 'SWITCHES' => 2, 'TRIGGERS' => 2, 'TRUNCATE' => 2, 'UNDOFILE' => 2, + 'WARNINGS' => 2, + 'AGGREGATE' => 2, 'ALGORITHM' => 2, 'COLLATION' => 2, 'COMMITTED' => 2, + 'DIRECTORY' => 2, 'DUPLICATE' => 2, 'EXPANSION' => 2, 'IO_THREAD' => 2, + 'ISOLATION' => 2, 'NODEGROUP' => 2, 'PACK_KEYS' => 2, 'READ_ONLY' => 2, + 'REDUNDANT' => 2, 'ROW_COUNT' => 2, 'SAVEPOINT' => 2, 'SQL_CACHE' => 2, + 'TEMPORARY' => 2, 'TEMPTABLE' => 2, 'TIMESTAMP' => 2, 'UNDEFINED' => 2, + 'UNINSTALL' => 2, 'VARIABLES' => 2, + 'COMPLETION' => 2, 'COMPRESSED' => 2, 'CONCURRENT' => 2, 'CONNECTION' => 2, + 'CONSISTENT' => 2, 'DEALLOCATE' => 2, 'GET_FORMAT' => 2, 'IDENTIFIED' => 2, + 'LINESTRING' => 2, 'MASTER_SSL' => 2, 'MULTIPOINT' => 2, 'NDBCLUSTER' => 2, + 'PARTITIONS' => 2, 'PLUGIN_DIR' => 2, 'PRIVILEGES' => 2, 'REORGANIZE' => 2, + 'REPEATABLE' => 2, 'ROW_FORMAT' => 2, 'SQL_THREAD' => 2, 'TABLESPACE' => 2, + 'TABLE_NAME' => 2, 'VALIDATION' => 2, + 'COLUMN_NAME' => 2, 'COMPRESSION' => 2, 'CURSOR_NAME' => 2, 'DIAGNOSTICS' => 2, + 'EXTENT_SIZE' => 2, 'MASTER_HOST' => 2, 'MASTER_PORT' => 2, 'MASTER_USER' => 2, + 'MICROSECOND' => 2, 'MYSQL_ERRNO' => 2, 'NONBLOCKING' => 2, 'PROCESSLIST' => 2, + 'REPLICATION' => 2, 'SCHEMA_NAME' => 2, 'SQL_TSI_DAY' => 2, 'TRANSACTION' => 2, + 'UNCOMMITTED' => 2, + 'CATALOG_NAME' => 2, 'CLASS_ORIGIN' => 2, 'DEFAULT_AUTH' => 2, + 'DES_KEY_FILE' => 2, 'INITIAL_SIZE' => 2, 'MASTER_DELAY' => 2, + 'MESSAGE_TEXT' => 2, 'MULTIPOLYGON' => 2, 'OLD_PASSWORD' => 2, + 'PARTITIONING' => 2, 'RELAY_THREAD' => 2, 'SERIALIZABLE' => 2, + 'SQL_NO_CACHE' => 2, 'SQL_TSI_HOUR' => 2, 'SQL_TSI_WEEK' => 2, + 'SQL_TSI_YEAR' => 2, 'SUBPARTITION' => 2, 'TIMESTAMPADD' => 2, + 'COLUMN_FORMAT' => 2, 'INSERT_METHOD' => 2, 'MASTER_SSL_CA' => 2, + 'RELAY_LOG_POS' => 2, 'SQL_TSI_MONTH' => 2, 'SUBPARTITIONS' => 2, + 'TIMESTAMPDIFF' => 2, 'WEIGHT_STRING' => 2, + 'AUTO_INCREMENT' => 2, 'AVG_ROW_LENGTH' => 2, 'KEY_BLOCK_SIZE' => 2, + 'MASTER_LOG_POS' => 2, 'MASTER_SSL_CRL' => 2, 'MASTER_SSL_KEY' => 2, + 'RELAY_LOG_FILE' => 2, 'SQL_TSI_MINUTE' => 2, 'SQL_TSI_SECOND' => 2, + 'TABLE_CHECKSUM' => 2, 'USER_RESOURCES' => 2, + 'AUTOEXTEND_SIZE' => 2, 'CONSTRAINT_NAME' => 2, 'DELAY_KEY_WRITE' => 2, + 'FILE_BLOCK_SIZE' => 2, 'MASTER_LOG_FILE' => 2, 'MASTER_PASSWORD' => 2, + 'MASTER_SSL_CERT' => 2, 'MULTILINESTRING' => 2, 'PARSE_GCOL_EXPR' => 2, + 'REPLICATE_DO_DB' => 2, 'SQL_AFTER_GTIDS' => 2, 'SQL_TSI_QUARTER' => 2, + 'SUBCLASS_ORIGIN' => 2, + 'MASTER_SERVER_ID' => 2, 'REDO_BUFFER_SIZE' => 2, 'SQL_BEFORE_GTIDS' => 2, + 'STATS_PERSISTENT' => 2, 'UNDO_BUFFER_SIZE' => 2, + 'CONSTRAINT_SCHEMA' => 2, 'GROUP_REPLICATION' => 2, 'IGNORE_SERVER_IDS' => 2, + 'MASTER_SSL_CAPATH' => 2, 'MASTER_SSL_CIPHER' => 2, 'RETURNED_SQLSTATE' => 2, + 'SQL_BUFFER_RESULT' => 2, 'STATS_AUTO_RECALC' => 2, + 'CONSTRAINT_CATALOG' => 2, 'GEOMETRYCOLLECTION' => 2, 'MASTER_RETRY_COUNT' => 2, + 'MASTER_SSL_CRLPATH' => 2, 'MAX_STATEMENT_TIME' => 2, 'REPLICATE_DO_TABLE' => 2, + 'SQL_AFTER_MTS_GAPS' => 2, 'STATS_SAMPLE_PAGES' => 2, + 'REPLICATE_IGNORE_DB' => 2, + 'MASTER_AUTO_POSITION' => 2, 'MASTER_CONNECT_RETRY' => 2, + 'MAX_QUERIES_PER_HOUR' => 2, 'MAX_UPDATES_PER_HOUR' => 2, + 'MAX_USER_CONNECTIONS' => 2, 'REPLICATE_REWRITE_DB' => 2, + 'REPLICATE_IGNORE_TABLE' => 2, + 'MASTER_HEARTBEAT_PERIOD' => 2, 'REPLICATE_WILD_DO_TABLE' => 2, + 'MAX_CONNECTIONS_PER_HOUR' => 2, + 'REPLICATE_WILD_IGNORE_TABLE' => 2, - 'END' => 2, - 'INDEX' => 2, 'VALUE' => 2, - 'ENGINE' => 2, - 'CHARSET' => 2, 'COMMENT' => 2, 'RETURNS' => 2, 'STORAGE' => 2, - 'CHECKSUM' => 2, 'MAX_ROWS' => 2, 'MIN_ROWS' => 2, 'NOT NULL' => 2, - 'PASSWORD' => 2, - 'INDEX KEY' => 2, 'PACK_KEYS' => 2, - 'ROW_FORMAT' => 2, 'TABLESPACE' => 2, - 'UNIQUE KEY' => 2, - 'FOREIGN KEY' => 2, 'PRIMARY KEY' => 2, 'PRIMARY KEY' => 2, - 'SPATIAL KEY' => 2, - 'FULLTEXT KEY' => 2, 'UNIQUE INDEX' => 2, - 'CHARACTER SET' => 2, 'IF NOT EXISTS' => 2, 'INSERT_METHOD' => 2, - 'SPATIAL INDEX' => 2, - 'AUTO_INCREMENT' => 2, 'AVG_ROW_LENGTH' => 2, 'DATA DIRECTORY' => 2, - 'FULLTEXT INDEX' => 2, 'KEY_BLOCK_SIZE' => 2, - 'DEFAULT COLLATE' => 2, - 'DELAY_KEY_WRITE' => 2, 'INDEX DIRECTORY' => 2, - 'DEFAULT CHARACTER SET' => 2, + 'NOT NULL' => 4, + 'INDEX KEY' => 4, + 'UNIQUE KEY' => 4, + 'FOREIGN KEY' => 4, 'PRIMARY KEY' => 4, 'PRIMARY KEY' => 4, 'SPATIAL KEY' => 4, + 'FULLTEXT KEY' => 4, 'UNIQUE INDEX' => 4, + 'CHARACTER SET' => 4, 'IF NOT EXISTS' => 4, 'SPATIAL INDEX' => 4, + 'DATA DIRECTORY' => 4, 'FULLTEXT INDEX' => 4, + 'DEFAULT COLLATE' => 4, 'INDEX DIRECTORY' => 4, + 'DEFAULT CHARACTER SET' => 4, ); // ------------------------------------------------------------------------- @@ -155,12 +268,15 @@ abstract class Context * @var array */ public static $DATA_TYPES = array( - 'ARRAY' => 1, 'BIGINT' => 1, 'BINARY VARYING' => 1, 'BINARY' => 1, - 'BOOLEAN' => 1, 'CHARACTER' => 1, 'CHARACTER' => 1, 'DATE' => 1, - 'DECIMAL' => 1, 'DOUBLE' => 1, 'FLOAT' => 1, 'FLOAT' => 1, 'INT' => 1, - 'INTEGER' => 1, 'INTERVAL' => 1, 'MULTISET' => 1, 'NUMERIC' => 1, - 'REAL' => 1, 'SMALLINT' => 1, 'TIME' => 1, 'TIMESTAMP' => 1, - 'VARBINARY' => 1, 'VARCHAR' => 1, 'XML' => 1, + 'ARRAY' => 1, 'BIGINT' => 1, 'BINARY' => 1, 'BINARY VARYING' => 1, + 'BLOB' => 1, 'BOOLEAN' => 1, 'CHAR' => 1, 'CHARACTER' => 1, 'DATE' => 1, + 'DATETIME' => 1, 'DECIMAL' => 1, 'DOUBLE' => 1, 'ENUM' => 1, + 'FLOAT' => 1, 'INT' => 1, 'INTEGER' => 1, 'INTERVAL' => 1, + 'LONGBLOB' => 1, 'LONGTEXT' => 1, 'MEDIUMBLOB' => 1, 'MEDIUMINT' => 1, + 'MEDIUMTEXT' => 1, 'MULTISET' => 1, 'NUMERIC' => 1, 'REAL' => 1, + 'SET' => 1, 'SMALLINT' => 1, 'TEXT' => 1, 'TIME' => 1, 'TIMESTAMP' => 1, + 'TINYBLOB' => 1, 'TINYINT' => 1, 'TINYTEXT' => 1, 'VARBINARY' => 1, + 'VARCHAR' => 1, 'XML' => 1, 'YEAR' => 1 ); // ------------------------------------------------------------------------- @@ -309,19 +425,24 @@ abstract class Context * Checks if the given string is a keyword. * * @param string $str - * @param bool $strict + * @param bool $isReserved * * @return bool */ - public static function isKeyword($str, $strict = false) + public static function isKeyword($str, $isReserved = false) { $str = strtoupper($str); if (isset(static::$KEYWORDS[$str])) { - return $strict ? static::$KEYWORDS[$str] === 1 : true; + if ($isReserved) { + if (!(static::$KEYWORDS[$str] & Token::FLAG_KEYWORD_RESERVED)) { + return null; + } + } + return static::$KEYWORDS[$str]; } - return false; + return null; } // ------------------------------------------------------------------------- @@ -372,12 +493,14 @@ abstract class Context $len = strlen($str); if ($str[0] === '#') { return Token::FLAG_COMMENT_BASH; - } elseif (($len > 1) && ((($str[0] === '/') && ($str[1] === '*')) || - (($str[0] === '*') && ($str[1] === '/')))) { + } elseif (($len > 1) && ((($str[0] === '/') && ($str[1] === '*')) + || (($str[0] === '*') && ($str[1] === '/'))) + ) { return Token::FLAG_COMMENT_C; - } elseif (($len > 2) && ($str[0] === '-') && - ($str[1] === '-') && ($str[2] !== "\n") && - (static::isWhitespace($str[2]))) { + } elseif (($len > 2) && ($str[0] === '-') + && ($str[1] === '-') && ($str[2] !== "\n") + && (static::isWhitespace($str[2])) + ) { return Token::FLAG_COMMENT_SQL; } return null; @@ -413,8 +536,8 @@ abstract class Context */ public static function isNumber($ch) { - return (($ch >= '0') && ($ch <= '9')) || ($ch === '.') || - ($ch === '-') || ($ch === '+') || ($ch === 'e') || ($ch === 'E'); + return (($ch >= '0') && ($ch <= '9')) || ($ch === '.') + || ($ch === '-') || ($ch === '+') || ($ch === 'e') || ($ch === 'E'); } // ------------------------------------------------------------------------- @@ -472,4 +595,27 @@ abstract class Context { return !ctype_alnum($ch) && $ch !== '_'; } + + /** + * Loads the specified context. + * + * Contexts may be used by accessing the context directly. + * + * @param string $context + */ + public static function load($context = '') + { + if (empty($context)) { + $context = self::$defaultContext; + } + if ($context[0] !== '\\') { + // Short context name (must be formatted into class name). + $context = '\\SqlParser\\Contexts\\Context_' . $context; + } + if (!class_exists($context)) { + throw new \Exception('Specified context ("' . $context . '") doesn\'t exist.'); + } + static::$loadedContext = $context; + static::$KEYWORDS = $context::$KEYWORDS; + } } diff --git a/libraries/sql-parser/src/Contexts/Context_MySQL50000.php b/libraries/sql-parser/src/Contexts/Context_MySQL50000.php new file mode 100644 index 0000000000..e1d036ef0c --- /dev/null +++ b/libraries/sql-parser/src/Contexts/Context_MySQL50000.php @@ -0,0 +1,163 @@ + 1, 'BY' => 1, 'IF' => 1, 'IN' => 1, 'IS' => 1, + 'ON' => 1, 'OR' => 1, 'TO' => 1, + 'ADD' => 1, 'ALL' => 1, 'AND' => 1, 'ASC' => 1, 'DEC' => 1, + 'DIV' => 1, 'FOR' => 1, 'INT' => 1, 'KEY' => 1, 'MOD' => 1, + 'NOT' => 1, 'OUT' => 1, 'SET' => 1, 'SQL' => 1, 'SSL' => 1, + 'USE' => 1, 'XOR' => 1, + 'BLOB' => 1, 'BOTH' => 1, 'CALL' => 1, 'CASE' => 1, + 'CHAR' => 1, 'DESC' => 1, 'DROP' => 1, 'DUAL' => 1, + 'EACH' => 1, 'ELSE' => 1, 'EXIT' => 1, 'FROM' => 1, + 'INT1' => 1, 'INT2' => 1, 'INT3' => 1, 'INT4' => 1, + 'INT8' => 1, 'INTO' => 1, 'JOIN' => 1, 'KEYS' => 1, + 'KILL' => 1, 'LEFT' => 1, 'LIKE' => 1, 'LOAD' => 1, + 'LOCK' => 1, 'LONG' => 1, 'LOOP' => 1, 'NULL' => 1, + 'READ' => 1, 'REAL' => 1, 'SHOW' => 1, 'THEN' => 1, + 'TRUE' => 1, 'UNDO' => 1, 'WHEN' => 1, 'WITH' => 1, + 'ALTER' => 1, 'CHECK' => 1, 'CROSS' => 1, 'FALSE' => 1, + 'FETCH' => 1, 'FLOAT' => 1, 'FORCE' => 1, 'GRANT' => 1, + 'GROUP' => 1, 'INDEX' => 1, 'INNER' => 1, 'INOUT' => 1, + 'LEAVE' => 1, 'LIMIT' => 1, 'LINES' => 1, 'MATCH' => 1, + 'ORDER' => 1, 'OUTER' => 1, 'PURGE' => 1, 'READS' => 1, + 'RIGHT' => 1, 'RLIKE' => 1, 'TABLE' => 1, 'UNION' => 1, + 'USAGE' => 1, 'USING' => 1, 'WHERE' => 1, 'WHILE' => 1, + 'WRITE' => 1, + 'BEFORE' => 1, 'BIGINT' => 1, 'BINARY' => 1, 'CHANGE' => 1, + 'COLUMN' => 1, 'CREATE' => 1, 'CURSOR' => 1, 'DELETE' => 1, + 'DOUBLE' => 1, 'ELSEIF' => 1, 'EXISTS' => 1, 'FLOAT4' => 1, + 'FLOAT8' => 1, 'HAVING' => 1, 'IGNORE' => 1, 'INFILE' => 1, + 'INSERT' => 1, 'OPTION' => 1, 'REGEXP' => 1, 'RENAME' => 1, + 'REPEAT' => 1, 'RETURN' => 1, 'REVOKE' => 1, 'SCHEMA' => 1, + 'SELECT' => 1, 'SONAME' => 1, 'UNIQUE' => 1, 'UNLOCK' => 1, + 'UPDATE' => 1, 'VALUES' => 1, + 'ANALYZE' => 1, 'BETWEEN' => 1, 'CASCADE' => 1, 'COLLATE' => 1, + 'CONVERT' => 1, 'DECIMAL' => 1, 'DECLARE' => 1, 'DEFAULT' => 1, + 'DELAYED' => 1, 'ESCAPED' => 1, 'EXPLAIN' => 1, 'FOREIGN' => 1, + 'INTEGER' => 1, 'ITERATE' => 1, 'LEADING' => 1, 'NATURAL' => 1, + 'NUMERIC' => 1, 'OUTFILE' => 1, 'PRIMARY' => 1, 'RELEASE' => 1, + 'REPLACE' => 1, 'REQUIRE' => 1, 'SCHEMAS' => 1, 'SPATIAL' => 1, + 'TINYINT' => 1, 'TRIGGER' => 1, 'VARCHAR' => 1, 'VARYING' => 1, + 'CONTINUE' => 1, 'DATABASE' => 1, 'DAY_HOUR' => 1, + 'DESCRIBE' => 1, 'DISTINCT' => 1, 'ENCLOSED' => 1, + 'FULLTEXT' => 1, 'INTERVAL' => 1, 'LONGBLOB' => 1, + 'LONGTEXT' => 1, 'MODIFIES' => 1, 'OPTIMIZE' => 1, + 'RESTRICT' => 1, 'SMALLINT' => 1, 'SPECIFIC' => 1, + 'SQLSTATE' => 1, 'STARTING' => 1, 'TINYBLOB' => 1, + 'TINYTEXT' => 1, 'TRAILING' => 1, 'UNSIGNED' => 1, + 'UTC_DATE' => 1, 'UTC_TIME' => 1, 'ZEROFILL' => 1, + 'CHARACTER' => 1, 'CONDITION' => 1, 'DATABASES' => 1, + 'LOCALTIME' => 1, 'MEDIUMINT' => 1, 'MIDDLEINT' => 1, + 'PRECISION' => 1, 'PROCEDURE' => 1, 'SENSITIVE' => 1, + 'SEPARATOR' => 1, 'VARBINARY' => 1, + 'ASENSITIVE' => 1, 'CONSTRAINT' => 1, 'DAY_MINUTE' => 1, + 'DAY_SECOND' => 1, 'MEDIUMBLOB' => 1, 'MEDIUMTEXT' => 1, + 'OPTIONALLY' => 1, 'REFERENCES' => 1, 'SQLWARNING' => 1, + 'TERMINATED' => 1, 'YEAR_MONTH' => 1, + 'DISTINCTROW' => 1, 'HOUR_MINUTE' => 1, 'HOUR_SECOND' => 1, + 'INSENSITIVE' => 1, + 'CURRENT_DATE' => 1, 'CURRENT_TIME' => 1, 'CURRENT_USER' => 1, + 'LOW_PRIORITY' => 1, 'SQLEXCEPTION' => 1, 'VARCHARACTER' => 1, + 'DETERMINISTIC' => 1, 'HIGH_PRIORITY' => 1, 'MINUTE_SECOND' => 1, + 'STRAIGHT_JOIN' => 1, 'UTC_TIMESTAMP' => 1, + 'LOCALTIMESTAMP' => 1, 'SQL_BIG_RESULT' => 1, + 'DAY_MICROSECOND' => 1, + 'HOUR_MICROSECOND' => 1, 'SQL_SMALL_RESULT' => 1, + 'CURRENT_TIMESTAMP' => 1, + 'MINUTE_MICROSECOND' => 1, 'NO_WRITE_TO_BINLOG' => 1, + 'SECOND_MICROSECOND' => 1, + 'SQL_CALC_FOUND_ROWS' => 1, + + 'DO' => 2, 'IO' => 2, 'NO' => 2, 'XA' => 2, + 'ANY' => 2, 'AVG' => 2, 'BDB' => 2, 'BIT' => 2, 'CPU' => 2, 'DAY' => 2, + 'END' => 2, 'IPC' => 2, 'NDB' => 2, 'NEW' => 2, 'ONE' => 2, 'ROW' => 2, + 'BOOL' => 2, 'BYTE' => 2, 'CODE' => 2, 'CUBE' => 2, 'DATA' => 2, 'DATE' => 2, + 'ENUM' => 2, 'FAST' => 2, 'FILE' => 2, 'FULL' => 2, 'HASH' => 2, 'HELP' => 2, + 'HOUR' => 2, 'LAST' => 2, 'LOGS' => 2, 'MODE' => 2, 'NAME' => 2, 'NEXT' => 2, + 'NONE' => 2, 'OPEN' => 2, 'PAGE' => 2, 'PREV' => 2, 'ROWS' => 2, 'SOME' => 2, + 'STOP' => 2, 'TEXT' => 2, 'TIME' => 2, 'TYPE' => 2, 'USER' => 2, 'VIEW' => 2, + 'WEEK' => 2, 'WORK' => 2, 'X509' => 2, 'YEAR' => 2, + 'AFTER' => 2, 'ASCII' => 2, 'BEGIN' => 2, 'BLOCK' => 2, 'BTREE' => 2, + 'CACHE' => 2, 'CHAIN' => 2, 'CLOSE' => 2, 'FIRST' => 2, 'FIXED' => 2, + 'FLUSH' => 2, 'FOUND' => 2, 'HOSTS' => 2, 'LEVEL' => 2, 'LOCAL' => 2, + 'LOCKS' => 2, 'MERGE' => 2, 'MONTH' => 2, 'MUTEX' => 2, 'NAMES' => 2, + 'NCHAR' => 2, 'PHASE' => 2, 'POINT' => 2, 'QUERY' => 2, 'QUICK' => 2, + 'RAID0' => 2, 'RESET' => 2, 'RTREE' => 2, 'SHARE' => 2, 'SLAVE' => 2, + 'START' => 2, 'SUPER' => 2, 'SWAPS' => 2, 'TYPES' => 2, 'UNTIL' => 2, + 'VALUE' => 2, + 'ACTION' => 2, 'BACKUP' => 2, 'BINLOG' => 2, 'CIPHER' => 2, 'CLIENT' => 2, + 'COMMIT' => 2, 'ENABLE' => 2, 'ENGINE' => 2, 'ERRORS' => 2, 'ESCAPE' => 2, + 'EVENTS' => 2, 'FAULTS' => 2, 'FIELDS' => 2, 'GLOBAL' => 2, 'GRANTS' => 2, + 'IMPORT' => 2, 'INNODB' => 2, 'ISSUER' => 2, 'LEAVES' => 2, 'MASTER' => 2, + 'MEDIUM' => 2, 'MEMORY' => 2, 'MINUTE' => 2, 'MODIFY' => 2, 'OFFSET' => 2, + 'RELOAD' => 2, 'REPAIR' => 2, 'RESUME' => 2, 'ROLLUP' => 2, 'SECOND' => 2, + 'SERIAL' => 2, 'SIGNED' => 2, 'SIMPLE' => 2, 'SOUNDS' => 2, 'SOURCE' => 2, + 'STATUS' => 2, 'STRING' => 2, 'TABLES' => 2, + 'AGAINST' => 2, 'BOOLEAN' => 2, 'CHANGED' => 2, 'CHARSET' => 2, 'COLUMNS' => 2, + 'COMMENT' => 2, 'COMPACT' => 2, 'CONTEXT' => 2, 'DEFINER' => 2, 'DISABLE' => 2, + 'DISCARD' => 2, 'DYNAMIC' => 2, 'ENGINES' => 2, 'EXECUTE' => 2, 'HANDLER' => 2, + 'INDEXES' => 2, 'INVOKER' => 2, 'MIGRATE' => 2, 'PARTIAL' => 2, 'POLYGON' => 2, + 'PREPARE' => 2, 'PROFILE' => 2, 'QUARTER' => 2, 'RECOVER' => 2, 'RESTORE' => 2, + 'RETURNS' => 2, 'ROUTINE' => 2, 'SESSION' => 2, 'STORAGE' => 2, 'STRIPED' => 2, + 'SUBJECT' => 2, 'SUSPEND' => 2, 'UNICODE' => 2, 'UNKNOWN' => 2, 'UPGRADE' => 2, + 'USE_FRM' => 2, + 'CASCADED' => 2, 'CHECKSUM' => 2, 'CONTAINS' => 2, 'DATETIME' => 2, + 'DUMPFILE' => 2, 'EXTENDED' => 2, 'FUNCTION' => 2, 'GEOMETRY' => 2, + 'INNOBASE' => 2, 'LANGUAGE' => 2, 'MAX_ROWS' => 2, 'MIN_ROWS' => 2, + 'NATIONAL' => 2, 'NVARCHAR' => 2, 'ONE_SHOT' => 2, 'PASSWORD' => 2, + 'PROFILES' => 2, 'ROLLBACK' => 2, 'SECURITY' => 2, 'SHUTDOWN' => 2, + 'SNAPSHOT' => 2, 'SWITCHES' => 2, 'TRIGGERS' => 2, 'TRUNCATE' => 2, + 'WARNINGS' => 2, + 'AGGREGATE' => 2, 'ALGORITHM' => 2, 'COLLATION' => 2, 'COMMITTED' => 2, + 'DIRECTORY' => 2, 'DUPLICATE' => 2, 'EXPANSION' => 2, 'IO_THREAD' => 2, + 'ISOLATION' => 2, 'PACK_KEYS' => 2, 'RAID_TYPE' => 2, 'REDUNDANT' => 2, + 'SAVEPOINT' => 2, 'SQL_CACHE' => 2, 'TEMPORARY' => 2, 'TEMPTABLE' => 2, + 'TIMESTAMP' => 2, 'UNDEFINED' => 2, 'VARIABLES' => 2, + 'BERKELEYDB' => 2, 'COMPRESSED' => 2, 'CONCURRENT' => 2, 'CONNECTION' => 2, + 'CONSISTENT' => 2, 'DEALLOCATE' => 2, 'GET_FORMAT' => 2, 'IDENTIFIED' => 2, + 'LINESTRING' => 2, 'MASTER_SSL' => 2, 'MULTIPOINT' => 2, 'NDBCLUSTER' => 2, + 'PRIVILEGES' => 2, 'REPEATABLE' => 2, 'ROW_FORMAT' => 2, 'SQL_THREAD' => 2, + 'TABLESPACE' => 2, + 'FRAC_SECOND' => 2, 'MASTER_HOST' => 2, 'MASTER_PORT' => 2, 'MASTER_USER' => 2, + 'MICROSECOND' => 2, 'PROCESSLIST' => 2, 'RAID_CHUNKS' => 2, 'REPLICATION' => 2, + 'SQL_TSI_DAY' => 2, 'TRANSACTION' => 2, 'UNCOMMITTED' => 2, + 'DES_KEY_FILE' => 2, 'MULTIPOLYGON' => 2, 'OLD_PASSWORD' => 2, + 'RELAY_THREAD' => 2, 'SERIALIZABLE' => 2, 'SQL_NO_CACHE' => 2, + 'SQL_TSI_HOUR' => 2, 'SQL_TSI_WEEK' => 2, 'SQL_TSI_YEAR' => 2, + 'TIMESTAMPADD' => 2, + 'INSERT_METHOD' => 2, 'MASTER_SSL_CA' => 2, 'RELAY_LOG_POS' => 2, + 'SQL_TSI_MONTH' => 2, 'TIMESTAMPDIFF' => 2, + 'AUTO_INCREMENT' => 2, 'AVG_ROW_LENGTH' => 2, 'MASTER_LOG_POS' => 2, + 'MASTER_SSL_KEY' => 2, 'RAID_CHUNKSIZE' => 2, 'RELAY_LOG_FILE' => 2, + 'SQL_TSI_MINUTE' => 2, 'SQL_TSI_SECOND' => 2, 'USER_RESOURCES' => 2, + 'DELAY_KEY_WRITE' => 2, 'MASTER_LOG_FILE' => 2, 'MASTER_PASSWORD' => 2, + 'MASTER_SSL_CERT' => 2, 'MULTILINESTRING' => 2, 'SQL_TSI_QUARTER' => 2, + 'MASTER_SERVER_ID' => 2, + 'MASTER_SSL_CAPATH' => 2, 'MASTER_SSL_CIPHER' => 2, 'SQL_BUFFER_RESULT' => 2, + 'GEOMETRYCOLLECTION' => 2, + 'SQL_TSI_FRAC_SECOND' => 2, + 'MASTER_CONNECT_RETRY' => 2, 'MAX_QUERIES_PER_HOUR' => 2, + 'MAX_UPDATES_PER_HOUR' => 2, 'MAX_USER_CONNECTIONS' => 2, + 'MAX_CONNECTIONS_PER_HOUR' => 2, + + 'NOT NULL' => 4, + 'INDEX KEY' => 4, + 'UNIQUE KEY' => 4, + 'FOREIGN KEY' => 4, 'PRIMARY KEY' => 4, 'PRIMARY KEY' => 4, 'SPATIAL KEY' => 4, + 'FULLTEXT KEY' => 4, 'UNIQUE INDEX' => 4, + 'CHARACTER SET' => 4, 'IF NOT EXISTS' => 4, 'SPATIAL INDEX' => 4, + 'DATA DIRECTORY' => 4, 'FULLTEXT INDEX' => 4, + 'DEFAULT COLLATE' => 4, 'INDEX DIRECTORY' => 4, + 'DEFAULT CHARACTER SET' => 4, + + ); +} diff --git a/libraries/sql-parser/src/Contexts/Context_MySQL50100.php b/libraries/sql-parser/src/Contexts/Context_MySQL50100.php new file mode 100644 index 0000000000..ce83a5f854 --- /dev/null +++ b/libraries/sql-parser/src/Contexts/Context_MySQL50100.php @@ -0,0 +1,177 @@ + 1, 'BY' => 1, 'IF' => 1, 'IN' => 1, 'IS' => 1, + 'ON' => 1, 'OR' => 1, 'TO' => 1, + 'ADD' => 1, 'ALL' => 1, 'AND' => 1, 'ASC' => 1, 'DEC' => 1, + 'DIV' => 1, 'FOR' => 1, 'INT' => 1, 'KEY' => 1, 'MOD' => 1, + 'NOT' => 1, 'OUT' => 1, 'SET' => 1, 'SQL' => 1, 'SSL' => 1, + 'USE' => 1, 'XOR' => 1, + 'BLOB' => 1, 'BOTH' => 1, 'CALL' => 1, 'CASE' => 1, + 'CHAR' => 1, 'DESC' => 1, 'DROP' => 1, 'DUAL' => 1, + 'EACH' => 1, 'ELSE' => 1, 'EXIT' => 1, 'FROM' => 1, + 'INT1' => 1, 'INT2' => 1, 'INT3' => 1, 'INT4' => 1, + 'INT8' => 1, 'INTO' => 1, 'JOIN' => 1, 'KEYS' => 1, + 'KILL' => 1, 'LEFT' => 1, 'LIKE' => 1, 'LOAD' => 1, + 'LOCK' => 1, 'LONG' => 1, 'LOOP' => 1, 'NULL' => 1, + 'READ' => 1, 'REAL' => 1, 'SHOW' => 1, 'THEN' => 1, + 'TRUE' => 1, 'UNDO' => 1, 'WHEN' => 1, 'WITH' => 1, + 'ALTER' => 1, 'CHECK' => 1, 'CROSS' => 1, 'FALSE' => 1, + 'FETCH' => 1, 'FLOAT' => 1, 'FORCE' => 1, 'GRANT' => 1, + 'GROUP' => 1, 'INDEX' => 1, 'INNER' => 1, 'INOUT' => 1, + 'LEAVE' => 1, 'LIMIT' => 1, 'LINES' => 1, 'MATCH' => 1, + 'ORDER' => 1, 'OUTER' => 1, 'PURGE' => 1, 'RANGE' => 1, + 'READS' => 1, 'RIGHT' => 1, 'RLIKE' => 1, 'TABLE' => 1, + 'UNION' => 1, 'USAGE' => 1, 'USING' => 1, 'WHERE' => 1, + 'WHILE' => 1, 'WRITE' => 1, + 'BEFORE' => 1, 'BIGINT' => 1, 'BINARY' => 1, 'CHANGE' => 1, + 'COLUMN' => 1, 'CREATE' => 1, 'CURSOR' => 1, 'DELETE' => 1, + 'DOUBLE' => 1, 'ELSEIF' => 1, 'EXISTS' => 1, 'FLOAT4' => 1, + 'FLOAT8' => 1, 'HAVING' => 1, 'IGNORE' => 1, 'INFILE' => 1, + 'INSERT' => 1, 'LINEAR' => 1, 'OPTION' => 1, 'REGEXP' => 1, + 'RENAME' => 1, 'REPEAT' => 1, 'RETURN' => 1, 'REVOKE' => 1, + 'SCHEMA' => 1, 'SELECT' => 1, 'UNIQUE' => 1, 'UNLOCK' => 1, + 'UPDATE' => 1, 'VALUES' => 1, + 'ANALYZE' => 1, 'BETWEEN' => 1, 'CASCADE' => 1, 'COLLATE' => 1, + 'CONVERT' => 1, 'DECIMAL' => 1, 'DECLARE' => 1, 'DEFAULT' => 1, + 'DELAYED' => 1, 'ESCAPED' => 1, 'EXPLAIN' => 1, 'FOREIGN' => 1, + 'INTEGER' => 1, 'ITERATE' => 1, 'LEADING' => 1, 'NATURAL' => 1, + 'NUMERIC' => 1, 'OUTFILE' => 1, 'PRIMARY' => 1, 'RELEASE' => 1, + 'REPLACE' => 1, 'REQUIRE' => 1, 'SCHEMAS' => 1, 'SPATIAL' => 1, + 'TINYINT' => 1, 'TRIGGER' => 1, 'VARCHAR' => 1, 'VARYING' => 1, + 'CONTINUE' => 1, 'DATABASE' => 1, 'DAY_HOUR' => 1, + 'DESCRIBE' => 1, 'DISTINCT' => 1, 'ENCLOSED' => 1, + 'FULLTEXT' => 1, 'INTERVAL' => 1, 'LONGBLOB' => 1, + 'LONGTEXT' => 1, 'MODIFIES' => 1, 'OPTIMIZE' => 1, + 'RESTRICT' => 1, 'SMALLINT' => 1, 'SPECIFIC' => 1, + 'SQLSTATE' => 1, 'STARTING' => 1, 'TINYBLOB' => 1, + 'TINYTEXT' => 1, 'TRAILING' => 1, 'UNSIGNED' => 1, + 'UTC_DATE' => 1, 'UTC_TIME' => 1, 'ZEROFILL' => 1, + 'CHARACTER' => 1, 'CONDITION' => 1, 'DATABASES' => 1, + 'LOCALTIME' => 1, 'MEDIUMINT' => 1, 'MIDDLEINT' => 1, + 'PRECISION' => 1, 'PROCEDURE' => 1, 'SENSITIVE' => 1, + 'SEPARATOR' => 1, 'VARBINARY' => 1, + 'ACCESSIBLE' => 1, 'ASENSITIVE' => 1, 'CONSTRAINT' => 1, + 'DAY_MINUTE' => 1, 'DAY_SECOND' => 1, 'MEDIUMBLOB' => 1, + 'MEDIUMTEXT' => 1, 'OPTIONALLY' => 1, 'READ_WRITE' => 1, + 'REFERENCES' => 1, 'SQLWARNING' => 1, 'TERMINATED' => 1, + 'YEAR_MONTH' => 1, + 'DISTINCTROW' => 1, 'HOUR_MINUTE' => 1, 'HOUR_SECOND' => 1, + 'INSENSITIVE' => 1, + 'CURRENT_DATE' => 1, 'CURRENT_TIME' => 1, 'CURRENT_USER' => 1, + 'LOW_PRIORITY' => 1, 'SQLEXCEPTION' => 1, 'VARCHARACTER' => 1, + 'DETERMINISTIC' => 1, 'HIGH_PRIORITY' => 1, 'MINUTE_SECOND' => 1, + 'STRAIGHT_JOIN' => 1, 'UTC_TIMESTAMP' => 1, + 'LOCALTIMESTAMP' => 1, 'SQL_BIG_RESULT' => 1, + 'DAY_MICROSECOND' => 1, + 'HOUR_MICROSECOND' => 1, 'SQL_SMALL_RESULT' => 1, + 'CURRENT_TIMESTAMP' => 1, + 'MINUTE_MICROSECOND' => 1, 'NO_WRITE_TO_BINLOG' => 1, + 'SECOND_MICROSECOND' => 1, + 'SQL_CALC_FOUND_ROWS' => 1, + 'MASTER_SSL_VERIFY_SERVER_CERT' => 1, + + 'AT' => 2, 'DO' => 2, 'IO' => 2, 'NO' => 2, 'XA' => 2, + 'ANY' => 2, 'AVG' => 2, 'BDB' => 2, 'BIT' => 2, 'CPU' => 2, 'DAY' => 2, + 'END' => 2, 'IPC' => 2, 'NDB' => 2, 'NEW' => 2, 'ONE' => 2, 'ROW' => 2, + 'BOOL' => 2, 'BYTE' => 2, 'CODE' => 2, 'CUBE' => 2, 'DATA' => 2, 'DATE' => 2, + 'DISK' => 2, 'ENDS' => 2, 'ENUM' => 2, 'FAST' => 2, 'FILE' => 2, 'FULL' => 2, + 'GOTO' => 2, 'HASH' => 2, 'HELP' => 2, 'HOST' => 2, 'HOUR' => 2, 'LAST' => 2, + 'LESS' => 2, 'LIST' => 2, 'LOGS' => 2, 'MODE' => 2, 'NAME' => 2, 'NEXT' => 2, + 'NONE' => 2, 'OPEN' => 2, 'PAGE' => 2, 'PORT' => 2, 'PREV' => 2, 'ROWS' => 2, + 'SOME' => 2, 'STOP' => 2, 'TEXT' => 2, 'THAN' => 2, 'TIME' => 2, 'TYPE' => 2, + 'USER' => 2, 'VIEW' => 2, 'WAIT' => 2, 'WEEK' => 2, 'WORK' => 2, 'X509' => 2, + 'YEAR' => 2, + 'AFTER' => 2, 'ASCII' => 2, 'BEGIN' => 2, 'BLOCK' => 2, 'BTREE' => 2, + 'CACHE' => 2, 'CHAIN' => 2, 'CLOSE' => 2, 'EVENT' => 2, 'EVERY' => 2, + 'FIRST' => 2, 'FIXED' => 2, 'FLUSH' => 2, 'FOUND' => 2, 'HOSTS' => 2, + 'LABEL' => 2, 'LEVEL' => 2, 'LOCAL' => 2, 'LOCKS' => 2, 'MERGE' => 2, + 'MONTH' => 2, 'MUTEX' => 2, 'NAMES' => 2, 'NCHAR' => 2, 'OWNER' => 2, + 'PHASE' => 2, 'POINT' => 2, 'QUERY' => 2, 'QUICK' => 2, 'RAID0' => 2, + 'RESET' => 2, 'RTREE' => 2, 'SHARE' => 2, 'SLAVE' => 2, 'START' => 2, + 'SUPER' => 2, 'SWAPS' => 2, 'TYPES' => 2, 'UNTIL' => 2, 'VALUE' => 2, + 'ACTION' => 2, 'BACKUP' => 2, 'BINLOG' => 2, 'CIPHER' => 2, 'CLIENT' => 2, + 'COMMIT' => 2, 'ENABLE' => 2, 'ENGINE' => 2, 'ERRORS' => 2, 'ESCAPE' => 2, + 'EVENTS' => 2, 'FAULTS' => 2, 'FIELDS' => 2, 'GLOBAL' => 2, 'GRANTS' => 2, + 'IMPORT' => 2, 'INNODB' => 2, 'ISSUER' => 2, 'LEAVES' => 2, 'MASTER' => 2, + 'MEDIUM' => 2, 'MEMORY' => 2, 'MINUTE' => 2, 'MODIFY' => 2, 'OFFSET' => 2, + 'PARSER' => 2, 'PLUGIN' => 2, 'RELOAD' => 2, 'REMOVE' => 2, 'REPAIR' => 2, + 'RESUME' => 2, 'ROLLUP' => 2, 'SECOND' => 2, 'SERIAL' => 2, 'SERVER' => 2, + 'SIGNED' => 2, 'SIMPLE' => 2, 'SOCKET' => 2, 'SONAME' => 2, 'SOUNDS' => 2, + 'SOURCE' => 2, 'STARTS' => 2, 'STATUS' => 2, 'STRING' => 2, 'TABLES' => 2, + 'AGAINST' => 2, 'AUTHORS' => 2, 'BOOLEAN' => 2, 'CHANGED' => 2, 'CHARSET' => 2, + 'COLUMNS' => 2, 'COMMENT' => 2, 'COMPACT' => 2, 'CONTEXT' => 2, 'DEFINER' => 2, + 'DISABLE' => 2, 'DISCARD' => 2, 'DYNAMIC' => 2, 'ENGINES' => 2, 'EXECUTE' => 2, + 'HANDLER' => 2, 'INDEXES' => 2, 'INSTALL' => 2, 'INVOKER' => 2, 'LOGFILE' => 2, + 'MIGRATE' => 2, 'NO_WAIT' => 2, 'OPTIONS' => 2, 'PARTIAL' => 2, 'PLUGINS' => 2, + 'POLYGON' => 2, 'PREPARE' => 2, 'PROFILE' => 2, 'QUARTER' => 2, 'REBUILD' => 2, + 'RECOVER' => 2, 'RESTORE' => 2, 'RETURNS' => 2, 'ROUTINE' => 2, 'SESSION' => 2, + 'STORAGE' => 2, 'STRIPED' => 2, 'SUBJECT' => 2, 'SUSPEND' => 2, 'UNICODE' => 2, + 'UNKNOWN' => 2, 'UPGRADE' => 2, 'USE_FRM' => 2, 'WRAPPER' => 2, + 'CASCADED' => 2, 'CHECKSUM' => 2, 'COALESCE' => 2, 'CONTAINS' => 2, + 'DATAFILE' => 2, 'DATETIME' => 2, 'DUMPFILE' => 2, 'EXTENDED' => 2, + 'FUNCTION' => 2, 'GEOMETRY' => 2, 'INNOBASE' => 2, 'LANGUAGE' => 2, + 'MAXVALUE' => 2, 'MAX_ROWS' => 2, 'MAX_SIZE' => 2, 'MIN_ROWS' => 2, + 'NATIONAL' => 2, 'NVARCHAR' => 2, 'ONE_SHOT' => 2, 'PASSWORD' => 2, + 'PRESERVE' => 2, 'PROFILES' => 2, 'REDOFILE' => 2, 'ROLLBACK' => 2, + 'SCHEDULE' => 2, 'SECURITY' => 2, 'SHUTDOWN' => 2, 'SNAPSHOT' => 2, + 'SWITCHES' => 2, 'TRIGGERS' => 2, 'TRUNCATE' => 2, 'UNDOFILE' => 2, + 'WARNINGS' => 2, + 'AGGREGATE' => 2, 'ALGORITHM' => 2, 'COLLATION' => 2, 'COMMITTED' => 2, + 'DIRECTORY' => 2, 'DUPLICATE' => 2, 'EXPANSION' => 2, 'IO_THREAD' => 2, + 'ISOLATION' => 2, 'NODEGROUP' => 2, 'PACK_KEYS' => 2, 'PARTITION' => 2, + 'RAID_TYPE' => 2, 'READ_ONLY' => 2, 'REDUNDANT' => 2, 'SAVEPOINT' => 2, + 'SCHEDULER' => 2, 'SQL_CACHE' => 2, 'TEMPORARY' => 2, 'TEMPTABLE' => 2, + 'TIMESTAMP' => 2, 'UNDEFINED' => 2, 'UNINSTALL' => 2, 'VARIABLES' => 2, + 'BERKELEYDB' => 2, 'COMPLETION' => 2, 'COMPRESSED' => 2, 'CONCURRENT' => 2, + 'CONNECTION' => 2, 'CONSISTENT' => 2, 'DEALLOCATE' => 2, 'GET_FORMAT' => 2, + 'IDENTIFIED' => 2, 'LINESTRING' => 2, 'MASTER_SSL' => 2, 'MULTIPOINT' => 2, + 'NDBCLUSTER' => 2, 'PARTITIONS' => 2, 'PRIVILEGES' => 2, 'REORGANISE' => 2, + 'REORGANIZE' => 2, 'REPEATABLE' => 2, 'ROW_FORMAT' => 2, 'SQL_THREAD' => 2, + 'TABLESPACE' => 2, + 'EXTENT_SIZE' => 2, 'FRAC_SECOND' => 2, 'MASTER_HOST' => 2, 'MASTER_PORT' => 2, + 'MASTER_USER' => 2, 'MICROSECOND' => 2, 'PROCESSLIST' => 2, 'RAID_CHUNKS' => 2, + 'REPLICATION' => 2, 'SQL_TSI_DAY' => 2, 'TRANSACTION' => 2, 'UNCOMMITTED' => 2, + 'CONTRIBUTORS' => 2, 'DES_KEY_FILE' => 2, 'INITIAL_SIZE' => 2, + 'MULTIPOLYGON' => 2, 'OLD_PASSWORD' => 2, 'PARTITIONING' => 2, + 'RELAY_THREAD' => 2, 'SERIALIZABLE' => 2, 'SQL_NO_CACHE' => 2, + 'SQL_TSI_HOUR' => 2, 'SQL_TSI_WEEK' => 2, 'SQL_TSI_YEAR' => 2, + 'SUBPARTITION' => 2, 'TIMESTAMPADD' => 2, + 'INSERT_METHOD' => 2, 'MASTER_SSL_CA' => 2, 'PAGE_CHECKSUM' => 2, + 'RELAY_LOG_POS' => 2, 'SQL_TSI_MONTH' => 2, 'SUBPARTITIONS' => 2, + 'TIMESTAMPDIFF' => 2, 'TRANSACTIONAL' => 2, + 'AUTO_INCREMENT' => 2, 'AVG_ROW_LENGTH' => 2, 'KEY_BLOCK_SIZE' => 2, + 'MASTER_LOG_POS' => 2, 'MASTER_SSL_KEY' => 2, 'RAID_CHUNKSIZE' => 2, + 'RELAY_LOG_FILE' => 2, 'SQL_TSI_MINUTE' => 2, 'SQL_TSI_SECOND' => 2, + 'TABLE_CHECKSUM' => 2, 'USER_RESOURCES' => 2, + 'AUTOEXTEND_SIZE' => 2, 'DELAY_KEY_WRITE' => 2, 'MASTER_LOG_FILE' => 2, + 'MASTER_PASSWORD' => 2, 'MASTER_SSL_CERT' => 2, 'MULTILINESTRING' => 2, + 'SQL_TSI_QUARTER' => 2, + 'MASTER_SERVER_ID' => 2, 'REDO_BUFFER_SIZE' => 2, 'UNDO_BUFFER_SIZE' => 2, + 'MASTER_SSL_CAPATH' => 2, 'MASTER_SSL_CIPHER' => 2, 'SQL_BUFFER_RESULT' => 2, + 'GEOMETRYCOLLECTION' => 2, + 'SQL_TSI_FRAC_SECOND' => 2, + 'MASTER_CONNECT_RETRY' => 2, 'MAX_QUERIES_PER_HOUR' => 2, + 'MAX_UPDATES_PER_HOUR' => 2, 'MAX_USER_CONNECTIONS' => 2, + 'MAX_CONNECTIONS_PER_HOUR' => 2, + + 'NOT NULL' => 4, + 'INDEX KEY' => 4, + 'UNIQUE KEY' => 4, + 'FOREIGN KEY' => 4, 'PRIMARY KEY' => 4, 'PRIMARY KEY' => 4, 'SPATIAL KEY' => 4, + 'FULLTEXT KEY' => 4, 'UNIQUE INDEX' => 4, + 'CHARACTER SET' => 4, 'IF NOT EXISTS' => 4, 'SPATIAL INDEX' => 4, + 'DATA DIRECTORY' => 4, 'FULLTEXT INDEX' => 4, + 'DEFAULT COLLATE' => 4, 'INDEX DIRECTORY' => 4, + 'DEFAULT CHARACTER SET' => 4, + + ); +} diff --git a/libraries/sql-parser/src/Contexts/Context_MySQL50500.php b/libraries/sql-parser/src/Contexts/Context_MySQL50500.php new file mode 100644 index 0000000000..8c3d570440 --- /dev/null +++ b/libraries/sql-parser/src/Contexts/Context_MySQL50500.php @@ -0,0 +1,181 @@ + 1, 'BY' => 1, 'IF' => 1, 'IN' => 1, 'IS' => 1, + 'ON' => 1, 'OR' => 1, 'TO' => 1, + 'ADD' => 1, 'ALL' => 1, 'AND' => 1, 'ASC' => 1, 'DEC' => 1, + 'DIV' => 1, 'FOR' => 1, 'INT' => 1, 'KEY' => 1, 'MOD' => 1, + 'NOT' => 1, 'OUT' => 1, 'SET' => 1, 'SQL' => 1, 'SSL' => 1, + 'USE' => 1, 'XOR' => 1, + 'BLOB' => 1, 'BOTH' => 1, 'CALL' => 1, 'CASE' => 1, + 'CHAR' => 1, 'DESC' => 1, 'DROP' => 1, 'DUAL' => 1, + 'EACH' => 1, 'ELSE' => 1, 'EXIT' => 1, 'FROM' => 1, + 'INT1' => 1, 'INT2' => 1, 'INT3' => 1, 'INT4' => 1, + 'INT8' => 1, 'INTO' => 1, 'JOIN' => 1, 'KEYS' => 1, + 'KILL' => 1, 'LEFT' => 1, 'LIKE' => 1, 'LOAD' => 1, + 'LOCK' => 1, 'LONG' => 1, 'LOOP' => 1, 'NULL' => 1, + 'READ' => 1, 'REAL' => 1, 'SHOW' => 1, 'THEN' => 1, + 'TRUE' => 1, 'UNDO' => 1, 'WHEN' => 1, 'WITH' => 1, + 'ALTER' => 1, 'CHECK' => 1, 'CROSS' => 1, 'FALSE' => 1, + 'FETCH' => 1, 'FLOAT' => 1, 'FORCE' => 1, 'GRANT' => 1, + 'GROUP' => 1, 'INDEX' => 1, 'INNER' => 1, 'INOUT' => 1, + 'LEAVE' => 1, 'LIMIT' => 1, 'LINES' => 1, 'MATCH' => 1, + 'ORDER' => 1, 'OUTER' => 1, 'PURGE' => 1, 'RANGE' => 1, + 'READS' => 1, 'RIGHT' => 1, 'RLIKE' => 1, 'TABLE' => 1, + 'UNION' => 1, 'USAGE' => 1, 'USING' => 1, 'WHERE' => 1, + 'WHILE' => 1, 'WRITE' => 1, + 'BEFORE' => 1, 'BIGINT' => 1, 'BINARY' => 1, 'CHANGE' => 1, + 'COLUMN' => 1, 'CREATE' => 1, 'CURSOR' => 1, 'DELETE' => 1, + 'DOUBLE' => 1, 'ELSEIF' => 1, 'EXISTS' => 1, 'FLOAT4' => 1, + 'FLOAT8' => 1, 'HAVING' => 1, 'IGNORE' => 1, 'INFILE' => 1, + 'INSERT' => 1, 'LINEAR' => 1, 'OPTION' => 1, 'REGEXP' => 1, + 'RENAME' => 1, 'REPEAT' => 1, 'RETURN' => 1, 'REVOKE' => 1, + 'SCHEMA' => 1, 'SELECT' => 1, 'SIGNAL' => 1, 'UNIQUE' => 1, + 'UNLOCK' => 1, 'UPDATE' => 1, 'VALUES' => 1, + 'ANALYZE' => 1, 'BETWEEN' => 1, 'CASCADE' => 1, 'COLLATE' => 1, + 'CONVERT' => 1, 'DECIMAL' => 1, 'DECLARE' => 1, 'DEFAULT' => 1, + 'DELAYED' => 1, 'ESCAPED' => 1, 'EXPLAIN' => 1, 'FOREIGN' => 1, + 'INTEGER' => 1, 'ITERATE' => 1, 'LEADING' => 1, 'NATURAL' => 1, + 'NUMERIC' => 1, 'OUTFILE' => 1, 'PRIMARY' => 1, 'RELEASE' => 1, + 'REPLACE' => 1, 'REQUIRE' => 1, 'SCHEMAS' => 1, 'SPATIAL' => 1, + 'TINYINT' => 1, 'TRIGGER' => 1, 'VARCHAR' => 1, 'VARYING' => 1, + 'CONTINUE' => 1, 'DATABASE' => 1, 'DAY_HOUR' => 1, + 'DESCRIBE' => 1, 'DISTINCT' => 1, 'ENCLOSED' => 1, + 'FULLTEXT' => 1, 'INTERVAL' => 1, 'LONGBLOB' => 1, + 'LONGTEXT' => 1, 'MAXVALUE' => 1, 'MODIFIES' => 1, + 'OPTIMIZE' => 1, 'RESIGNAL' => 1, 'RESTRICT' => 1, + 'SMALLINT' => 1, 'SPECIFIC' => 1, 'SQLSTATE' => 1, + 'STARTING' => 1, 'TINYBLOB' => 1, 'TINYTEXT' => 1, + 'TRAILING' => 1, 'UNSIGNED' => 1, 'UTC_DATE' => 1, + 'UTC_TIME' => 1, 'ZEROFILL' => 1, + 'CHARACTER' => 1, 'CONDITION' => 1, 'DATABASES' => 1, + 'LOCALTIME' => 1, 'MEDIUMINT' => 1, 'MIDDLEINT' => 1, + 'PRECISION' => 1, 'PROCEDURE' => 1, 'SENSITIVE' => 1, + 'SEPARATOR' => 1, 'VARBINARY' => 1, + 'ACCESSIBLE' => 1, 'ASENSITIVE' => 1, 'CONSTRAINT' => 1, + 'DAY_MINUTE' => 1, 'DAY_SECOND' => 1, 'MEDIUMBLOB' => 1, + 'MEDIUMTEXT' => 1, 'OPTIONALLY' => 1, 'READ_WRITE' => 1, + 'REFERENCES' => 1, 'SQLWARNING' => 1, 'TERMINATED' => 1, + 'YEAR_MONTH' => 1, + 'DISTINCTROW' => 1, 'HOUR_MINUTE' => 1, 'HOUR_SECOND' => 1, + 'INSENSITIVE' => 1, + 'CURRENT_DATE' => 1, 'CURRENT_TIME' => 1, 'CURRENT_USER' => 1, + 'LOW_PRIORITY' => 1, 'SQLEXCEPTION' => 1, 'VARCHARACTER' => 1, + 'DETERMINISTIC' => 1, 'HIGH_PRIORITY' => 1, 'MINUTE_SECOND' => 1, + 'STRAIGHT_JOIN' => 1, 'UTC_TIMESTAMP' => 1, + 'LOCALTIMESTAMP' => 1, 'SQL_BIG_RESULT' => 1, + 'DAY_MICROSECOND' => 1, + 'HOUR_MICROSECOND' => 1, 'SQL_SMALL_RESULT' => 1, + 'CURRENT_TIMESTAMP' => 1, + 'MINUTE_MICROSECOND' => 1, 'NO_WRITE_TO_BINLOG' => 1, + 'SECOND_MICROSECOND' => 1, + 'SQL_CALC_FOUND_ROWS' => 1, + 'MASTER_SSL_VERIFY_SERVER_CERT' => 1, + + 'AT' => 2, 'DO' => 2, 'IO' => 2, 'NO' => 2, 'XA' => 2, + 'ANY' => 2, 'AVG' => 2, 'BIT' => 2, 'CPU' => 2, 'DAY' => 2, 'END' => 2, + 'IPC' => 2, 'NDB' => 2, 'NEW' => 2, 'ONE' => 2, 'ROW' => 2, 'XML' => 2, + 'BOOL' => 2, 'BYTE' => 2, 'CODE' => 2, 'CUBE' => 2, 'DATA' => 2, 'DATE' => 2, + 'DISK' => 2, 'ENDS' => 2, 'ENUM' => 2, 'FAST' => 2, 'FILE' => 2, 'FULL' => 2, + 'HASH' => 2, 'HELP' => 2, 'HOST' => 2, 'HOUR' => 2, 'LAST' => 2, 'LESS' => 2, + 'LIST' => 2, 'LOGS' => 2, 'MODE' => 2, 'NAME' => 2, 'NEXT' => 2, 'NONE' => 2, + 'OPEN' => 2, 'PAGE' => 2, 'PORT' => 2, 'PREV' => 2, 'ROWS' => 2, 'SLOW' => 2, + 'SOME' => 2, 'STOP' => 2, 'TEXT' => 2, 'THAN' => 2, 'TIME' => 2, 'TYPE' => 2, + 'USER' => 2, 'VIEW' => 2, 'WAIT' => 2, 'WEEK' => 2, 'WORK' => 2, 'X509' => 2, + 'YEAR' => 2, + 'AFTER' => 2, 'ASCII' => 2, 'BEGIN' => 2, 'BLOCK' => 2, 'BTREE' => 2, + 'CACHE' => 2, 'CHAIN' => 2, 'CLOSE' => 2, 'ERROR' => 2, 'EVENT' => 2, + 'EVERY' => 2, 'FIRST' => 2, 'FIXED' => 2, 'FLUSH' => 2, 'FOUND' => 2, + 'HOSTS' => 2, 'LEVEL' => 2, 'LOCAL' => 2, 'LOCKS' => 2, 'MERGE' => 2, + 'MONTH' => 2, 'MUTEX' => 2, 'NAMES' => 2, 'NCHAR' => 2, 'OWNER' => 2, + 'PHASE' => 2, 'POINT' => 2, 'PROXY' => 2, 'QUERY' => 2, 'QUICK' => 2, + 'RELAY' => 2, 'RESET' => 2, 'RTREE' => 2, 'SHARE' => 2, 'SLAVE' => 2, + 'START' => 2, 'SUPER' => 2, 'SWAPS' => 2, 'TYPES' => 2, 'UNTIL' => 2, + 'VALUE' => 2, + 'ACTION' => 2, 'BACKUP' => 2, 'BINLOG' => 2, 'CIPHER' => 2, 'CLIENT' => 2, + 'COMMIT' => 2, 'ENABLE' => 2, 'ENGINE' => 2, 'ERRORS' => 2, 'ESCAPE' => 2, + 'EVENTS' => 2, 'FAULTS' => 2, 'FIELDS' => 2, 'GLOBAL' => 2, 'GRANTS' => 2, + 'IMPORT' => 2, 'INNODB' => 2, 'ISSUER' => 2, 'LEAVES' => 2, 'MASTER' => 2, + 'MEDIUM' => 2, 'MEMORY' => 2, 'MINUTE' => 2, 'MODIFY' => 2, 'OFFSET' => 2, + 'PARSER' => 2, 'PLUGIN' => 2, 'RELOAD' => 2, 'REMOVE' => 2, 'REPAIR' => 2, + 'RESUME' => 2, 'ROLLUP' => 2, 'SECOND' => 2, 'SERIAL' => 2, 'SERVER' => 2, + 'SIGNED' => 2, 'SIMPLE' => 2, 'SOCKET' => 2, 'SONAME' => 2, 'SOUNDS' => 2, + 'SOURCE' => 2, 'STARTS' => 2, 'STATUS' => 2, 'STRING' => 2, 'TABLES' => 2, + 'AGAINST' => 2, 'AUTHORS' => 2, 'BOOLEAN' => 2, 'CHANGED' => 2, 'CHARSET' => 2, + 'COLUMNS' => 2, 'COMMENT' => 2, 'COMPACT' => 2, 'CONTEXT' => 2, 'DEFINER' => 2, + 'DISABLE' => 2, 'DISCARD' => 2, 'DYNAMIC' => 2, 'ENGINES' => 2, 'EXECUTE' => 2, + 'GENERAL' => 2, 'HANDLER' => 2, 'INDEXES' => 2, 'INSTALL' => 2, 'INVOKER' => 2, + 'LOGFILE' => 2, 'MIGRATE' => 2, 'NO_WAIT' => 2, 'OPTIONS' => 2, 'PARTIAL' => 2, + 'PLUGINS' => 2, 'POLYGON' => 2, 'PREPARE' => 2, 'PROFILE' => 2, 'QUARTER' => 2, + 'REBUILD' => 2, 'RECOVER' => 2, 'RESTORE' => 2, 'RETURNS' => 2, 'ROUTINE' => 2, + 'SESSION' => 2, 'STORAGE' => 2, 'SUBJECT' => 2, 'SUSPEND' => 2, 'UNICODE' => 2, + 'UNKNOWN' => 2, 'UPGRADE' => 2, 'USE_FRM' => 2, 'WRAPPER' => 2, + 'CASCADED' => 2, 'CHECKSUM' => 2, 'COALESCE' => 2, 'CONTAINS' => 2, + 'DATAFILE' => 2, 'DATETIME' => 2, 'DUMPFILE' => 2, 'EXTENDED' => 2, + 'FUNCTION' => 2, 'GEOMETRY' => 2, 'INNOBASE' => 2, 'LANGUAGE' => 2, + 'MAX_ROWS' => 2, 'MAX_SIZE' => 2, 'MIN_ROWS' => 2, 'NATIONAL' => 2, + 'NVARCHAR' => 2, 'ONE_SHOT' => 2, 'PASSWORD' => 2, 'PRESERVE' => 2, + 'PROFILES' => 2, 'REDOFILE' => 2, 'RELAYLOG' => 2, 'ROLLBACK' => 2, + 'SCHEDULE' => 2, 'SECURITY' => 2, 'SHUTDOWN' => 2, 'SNAPSHOT' => 2, + 'SWITCHES' => 2, 'TRIGGERS' => 2, 'TRUNCATE' => 2, 'UNDOFILE' => 2, + 'WARNINGS' => 2, + 'AGGREGATE' => 2, 'ALGORITHM' => 2, 'COLLATION' => 2, 'COMMITTED' => 2, + 'DIRECTORY' => 2, 'DUPLICATE' => 2, 'EXPANSION' => 2, 'IO_THREAD' => 2, + 'ISOLATION' => 2, 'NODEGROUP' => 2, 'PACK_KEYS' => 2, 'PARTITION' => 2, + 'READ_ONLY' => 2, 'REDUNDANT' => 2, 'SAVEPOINT' => 2, 'SQL_CACHE' => 2, + 'TEMPORARY' => 2, 'TEMPTABLE' => 2, 'TIMESTAMP' => 2, 'UNDEFINED' => 2, + 'UNINSTALL' => 2, 'VARIABLES' => 2, + 'COMPLETION' => 2, 'COMPRESSED' => 2, 'CONCURRENT' => 2, 'CONNECTION' => 2, + 'CONSISTENT' => 2, 'DEALLOCATE' => 2, 'GET_FORMAT' => 2, 'IDENTIFIED' => 2, + 'LINESTRING' => 2, 'MASTER_SSL' => 2, 'MULTIPOINT' => 2, 'NDBCLUSTER' => 2, + 'PARTITIONS' => 2, 'PRIVILEGES' => 2, 'REORGANIZE' => 2, 'REPEATABLE' => 2, + 'ROW_FORMAT' => 2, 'SQL_THREAD' => 2, 'TABLESPACE' => 2, 'TABLE_NAME' => 2, + 'COLUMN_NAME' => 2, 'CURSOR_NAME' => 2, 'EXTENT_SIZE' => 2, 'FRAC_SECOND' => 2, + 'MASTER_HOST' => 2, 'MASTER_PORT' => 2, 'MASTER_USER' => 2, 'MICROSECOND' => 2, + 'MYSQL_ERRNO' => 2, 'PROCESSLIST' => 2, 'REPLICATION' => 2, 'SCHEMA_NAME' => 2, + 'SQL_TSI_DAY' => 2, 'TRANSACTION' => 2, 'UNCOMMITTED' => 2, + 'CATALOG_NAME' => 2, 'CLASS_ORIGIN' => 2, 'CONTRIBUTORS' => 2, + 'DES_KEY_FILE' => 2, 'INITIAL_SIZE' => 2, 'MESSAGE_TEXT' => 2, + 'MULTIPOLYGON' => 2, 'OLD_PASSWORD' => 2, 'PARTITIONING' => 2, + 'RELAY_THREAD' => 2, 'SERIALIZABLE' => 2, 'SQL_NO_CACHE' => 2, + 'SQL_TSI_HOUR' => 2, 'SQL_TSI_WEEK' => 2, 'SQL_TSI_YEAR' => 2, + 'SUBPARTITION' => 2, 'TIMESTAMPADD' => 2, + 'INSERT_METHOD' => 2, 'MASTER_SSL_CA' => 2, 'RELAY_LOG_POS' => 2, + 'SQL_TSI_MONTH' => 2, 'SUBPARTITIONS' => 2, 'TIMESTAMPDIFF' => 2, + 'AUTO_INCREMENT' => 2, 'AVG_ROW_LENGTH' => 2, 'KEY_BLOCK_SIZE' => 2, + 'MASTER_LOG_POS' => 2, 'MASTER_SSL_KEY' => 2, 'RELAY_LOG_FILE' => 2, + 'SQL_TSI_MINUTE' => 2, 'SQL_TSI_SECOND' => 2, 'TABLE_CHECKSUM' => 2, + 'USER_RESOURCES' => 2, + 'AUTOEXTEND_SIZE' => 2, 'CONSTRAINT_NAME' => 2, 'DELAY_KEY_WRITE' => 2, + 'MASTER_LOG_FILE' => 2, 'MASTER_PASSWORD' => 2, 'MASTER_SSL_CERT' => 2, + 'MULTILINESTRING' => 2, 'SQL_TSI_QUARTER' => 2, 'SUBCLASS_ORIGIN' => 2, + 'MASTER_SERVER_ID' => 2, 'REDO_BUFFER_SIZE' => 2, 'UNDO_BUFFER_SIZE' => 2, + 'CONSTRAINT_SCHEMA' => 2, 'IGNORE_SERVER_IDS' => 2, 'MASTER_SSL_CAPATH' => 2, + 'MASTER_SSL_CIPHER' => 2, 'SQL_BUFFER_RESULT' => 2, + 'CONSTRAINT_CATALOG' => 2, 'GEOMETRYCOLLECTION' => 2, + 'SQL_TSI_FRAC_SECOND' => 2, + 'MASTER_CONNECT_RETRY' => 2, 'MAX_QUERIES_PER_HOUR' => 2, + 'MAX_UPDATES_PER_HOUR' => 2, 'MAX_USER_CONNECTIONS' => 2, + 'MASTER_HEARTBEAT_PERIOD' => 2, + 'MAX_CONNECTIONS_PER_HOUR' => 2, + + 'NOT NULL' => 4, + 'INDEX KEY' => 4, + 'UNIQUE KEY' => 4, + 'FOREIGN KEY' => 4, 'PRIMARY KEY' => 4, 'PRIMARY KEY' => 4, 'SPATIAL KEY' => 4, + 'FULLTEXT KEY' => 4, 'UNIQUE INDEX' => 4, + 'CHARACTER SET' => 4, 'IF NOT EXISTS' => 4, 'SPATIAL INDEX' => 4, + 'DATA DIRECTORY' => 4, 'FULLTEXT INDEX' => 4, + 'DEFAULT COLLATE' => 4, 'INDEX DIRECTORY' => 4, + 'DEFAULT CHARACTER SET' => 4, + + ); +} diff --git a/libraries/sql-parser/src/Contexts/Context_MySQL50600.php b/libraries/sql-parser/src/Contexts/Context_MySQL50600.php new file mode 100644 index 0000000000..4f0b0d6c91 --- /dev/null +++ b/libraries/sql-parser/src/Contexts/Context_MySQL50600.php @@ -0,0 +1,190 @@ + 1, 'BY' => 1, 'IF' => 1, 'IN' => 1, 'IS' => 1, + 'ON' => 1, 'OR' => 1, 'TO' => 1, + 'ADD' => 1, 'ALL' => 1, 'AND' => 1, 'ASC' => 1, 'DEC' => 1, + 'DIV' => 1, 'FOR' => 1, 'GET' => 1, 'INT' => 1, 'KEY' => 1, + 'MOD' => 1, 'NOT' => 1, 'OUT' => 1, 'SET' => 1, 'SQL' => 1, + 'SSL' => 1, 'USE' => 1, 'XOR' => 1, + 'BLOB' => 1, 'BOTH' => 1, 'CALL' => 1, 'CASE' => 1, + 'CHAR' => 1, 'DESC' => 1, 'DROP' => 1, 'DUAL' => 1, + 'EACH' => 1, 'ELSE' => 1, 'EXIT' => 1, 'FROM' => 1, + 'INT1' => 1, 'INT2' => 1, 'INT3' => 1, 'INT4' => 1, + 'INT8' => 1, 'INTO' => 1, 'JOIN' => 1, 'KEYS' => 1, + 'KILL' => 1, 'LEFT' => 1, 'LIKE' => 1, 'LOAD' => 1, + 'LOCK' => 1, 'LONG' => 1, 'LOOP' => 1, 'NULL' => 1, + 'READ' => 1, 'REAL' => 1, 'SHOW' => 1, 'THEN' => 1, + 'TRUE' => 1, 'UNDO' => 1, 'WHEN' => 1, 'WITH' => 1, + 'ALTER' => 1, 'CHECK' => 1, 'CROSS' => 1, 'FALSE' => 1, + 'FETCH' => 1, 'FLOAT' => 1, 'FORCE' => 1, 'GRANT' => 1, + 'GROUP' => 1, 'INDEX' => 1, 'INNER' => 1, 'INOUT' => 1, + 'LEAVE' => 1, 'LIMIT' => 1, 'LINES' => 1, 'MATCH' => 1, + 'ORDER' => 1, 'OUTER' => 1, 'PURGE' => 1, 'RANGE' => 1, + 'READS' => 1, 'RIGHT' => 1, 'RLIKE' => 1, 'TABLE' => 1, + 'UNION' => 1, 'USAGE' => 1, 'USING' => 1, 'WHERE' => 1, + 'WHILE' => 1, 'WRITE' => 1, + 'BEFORE' => 1, 'BIGINT' => 1, 'BINARY' => 1, 'CHANGE' => 1, + 'COLUMN' => 1, 'CREATE' => 1, 'CURSOR' => 1, 'DELETE' => 1, + 'DOUBLE' => 1, 'ELSEIF' => 1, 'EXISTS' => 1, 'FLOAT4' => 1, + 'FLOAT8' => 1, 'HAVING' => 1, 'IGNORE' => 1, 'INFILE' => 1, + 'INSERT' => 1, 'LINEAR' => 1, 'OPTION' => 1, 'REGEXP' => 1, + 'RENAME' => 1, 'REPEAT' => 1, 'RETURN' => 1, 'REVOKE' => 1, + 'SCHEMA' => 1, 'SELECT' => 1, 'SIGNAL' => 1, 'UNIQUE' => 1, + 'UNLOCK' => 1, 'UPDATE' => 1, 'VALUES' => 1, + 'ANALYZE' => 1, 'BETWEEN' => 1, 'CASCADE' => 1, 'COLLATE' => 1, + 'CONVERT' => 1, 'DECIMAL' => 1, 'DECLARE' => 1, 'DEFAULT' => 1, + 'DELAYED' => 1, 'ESCAPED' => 1, 'EXPLAIN' => 1, 'FOREIGN' => 1, + 'INTEGER' => 1, 'ITERATE' => 1, 'LEADING' => 1, 'NATURAL' => 1, + 'NUMERIC' => 1, 'OUTFILE' => 1, 'PRIMARY' => 1, 'RELEASE' => 1, + 'REPLACE' => 1, 'REQUIRE' => 1, 'SCHEMAS' => 1, 'SPATIAL' => 1, + 'TINYINT' => 1, 'TRIGGER' => 1, 'VARCHAR' => 1, 'VARYING' => 1, + 'CONTINUE' => 1, 'DATABASE' => 1, 'DAY_HOUR' => 1, + 'DESCRIBE' => 1, 'DISTINCT' => 1, 'ENCLOSED' => 1, + 'FULLTEXT' => 1, 'INTERVAL' => 1, 'LONGBLOB' => 1, + 'LONGTEXT' => 1, 'MAXVALUE' => 1, 'MODIFIES' => 1, + 'OPTIMIZE' => 1, 'RESIGNAL' => 1, 'RESTRICT' => 1, + 'SMALLINT' => 1, 'SPECIFIC' => 1, 'SQLSTATE' => 1, + 'STARTING' => 1, 'TINYBLOB' => 1, 'TINYTEXT' => 1, + 'TRAILING' => 1, 'UNSIGNED' => 1, 'UTC_DATE' => 1, + 'UTC_TIME' => 1, 'ZEROFILL' => 1, + 'CHARACTER' => 1, 'CONDITION' => 1, 'DATABASES' => 1, + 'LOCALTIME' => 1, 'MEDIUMINT' => 1, 'MIDDLEINT' => 1, + 'PARTITION' => 1, 'PRECISION' => 1, 'PROCEDURE' => 1, + 'SENSITIVE' => 1, 'SEPARATOR' => 1, 'VARBINARY' => 1, + 'ACCESSIBLE' => 1, 'ASENSITIVE' => 1, 'CONSTRAINT' => 1, + 'DAY_MINUTE' => 1, 'DAY_SECOND' => 1, 'MEDIUMBLOB' => 1, + 'MEDIUMTEXT' => 1, 'OPTIONALLY' => 1, 'READ_WRITE' => 1, + 'REFERENCES' => 1, 'SQLWARNING' => 1, 'TERMINATED' => 1, + 'YEAR_MONTH' => 1, + 'DISTINCTROW' => 1, 'HOUR_MINUTE' => 1, 'HOUR_SECOND' => 1, + 'INSENSITIVE' => 1, 'MASTER_BIND' => 1, + 'CURRENT_DATE' => 1, 'CURRENT_TIME' => 1, 'CURRENT_USER' => 1, + 'LOW_PRIORITY' => 1, 'SQLEXCEPTION' => 1, 'VARCHARACTER' => 1, + 'DETERMINISTIC' => 1, 'HIGH_PRIORITY' => 1, 'MINUTE_SECOND' => 1, + 'STRAIGHT_JOIN' => 1, 'UTC_TIMESTAMP' => 1, + 'IO_AFTER_GTIDS' => 1, 'LOCALTIMESTAMP' => 1, 'SQL_BIG_RESULT' => 1, + 'DAY_MICROSECOND' => 1, 'IO_BEFORE_GTIDS' => 1, + 'HOUR_MICROSECOND' => 1, 'SQL_SMALL_RESULT' => 1, + 'CURRENT_TIMESTAMP' => 1, + 'MINUTE_MICROSECOND' => 1, 'NO_WRITE_TO_BINLOG' => 1, + 'SECOND_MICROSECOND' => 1, + 'SQL_CALC_FOUND_ROWS' => 1, + 'MASTER_SSL_VERIFY_SERVER_CERT' => 1, + + 'AT' => 2, 'DO' => 2, 'IO' => 2, 'NO' => 2, 'XA' => 2, + 'ANY' => 2, 'AVG' => 2, 'BIT' => 2, 'CPU' => 2, 'DAY' => 2, 'END' => 2, + 'IPC' => 2, 'NDB' => 2, 'NEW' => 2, 'ONE' => 2, 'ROW' => 2, 'XML' => 2, + 'BOOL' => 2, 'BYTE' => 2, 'CODE' => 2, 'CUBE' => 2, 'DATA' => 2, 'DATE' => 2, + 'DISK' => 2, 'ENDS' => 2, 'ENUM' => 2, 'FAST' => 2, 'FILE' => 2, 'FULL' => 2, + 'HASH' => 2, 'HELP' => 2, 'HOST' => 2, 'HOUR' => 2, 'LAST' => 2, 'LESS' => 2, + 'LIST' => 2, 'LOGS' => 2, 'MODE' => 2, 'NAME' => 2, 'NEXT' => 2, 'NONE' => 2, + 'ONLY' => 2, 'OPEN' => 2, 'PAGE' => 2, 'PORT' => 2, 'PREV' => 2, 'ROWS' => 2, + 'SLOW' => 2, 'SOME' => 2, 'STOP' => 2, 'TEXT' => 2, 'THAN' => 2, 'TIME' => 2, + 'TYPE' => 2, 'USER' => 2, 'VIEW' => 2, 'WAIT' => 2, 'WEEK' => 2, 'WORK' => 2, + 'X509' => 2, 'YEAR' => 2, + 'AFTER' => 2, 'ASCII' => 2, 'BEGIN' => 2, 'BLOCK' => 2, 'BTREE' => 2, + 'CACHE' => 2, 'CHAIN' => 2, 'CLOSE' => 2, 'ERROR' => 2, 'EVENT' => 2, + 'EVERY' => 2, 'FIRST' => 2, 'FIXED' => 2, 'FLUSH' => 2, 'FOUND' => 2, + 'HOSTS' => 2, 'LEVEL' => 2, 'LOCAL' => 2, 'LOCKS' => 2, 'MERGE' => 2, + 'MONTH' => 2, 'MUTEX' => 2, 'NAMES' => 2, 'NCHAR' => 2, 'OWNER' => 2, + 'PHASE' => 2, 'POINT' => 2, 'PROXY' => 2, 'QUERY' => 2, 'QUICK' => 2, + 'RELAY' => 2, 'RESET' => 2, 'RTREE' => 2, 'SHARE' => 2, 'SLAVE' => 2, + 'START' => 2, 'SUPER' => 2, 'SWAPS' => 2, 'TYPES' => 2, 'UNTIL' => 2, + 'VALUE' => 2, + 'ACTION' => 2, 'BACKUP' => 2, 'BINLOG' => 2, 'CIPHER' => 2, 'CLIENT' => 2, + 'COMMIT' => 2, 'ENABLE' => 2, 'ENGINE' => 2, 'ERRORS' => 2, 'ESCAPE' => 2, + 'EVENTS' => 2, 'EXPIRE' => 2, 'EXPORT' => 2, 'FAULTS' => 2, 'FIELDS' => 2, + 'FORMAT' => 2, 'GLOBAL' => 2, 'GRANTS' => 2, 'IMPORT' => 2, 'ISSUER' => 2, + 'LEAVES' => 2, 'MASTER' => 2, 'MEDIUM' => 2, 'MEMORY' => 2, 'MINUTE' => 2, + 'MODIFY' => 2, 'NUMBER' => 2, 'OFFSET' => 2, 'PARSER' => 2, 'PLUGIN' => 2, + 'RELOAD' => 2, 'REMOVE' => 2, 'REPAIR' => 2, 'RESUME' => 2, 'ROLLUP' => 2, + 'SECOND' => 2, 'SERIAL' => 2, 'SERVER' => 2, 'SIGNED' => 2, 'SIMPLE' => 2, + 'SOCKET' => 2, 'SONAME' => 2, 'SOUNDS' => 2, 'SOURCE' => 2, 'STARTS' => 2, + 'STATUS' => 2, 'STRING' => 2, 'TABLES' => 2, + 'AGAINST' => 2, 'ANALYSE' => 2, 'AUTHORS' => 2, 'BOOLEAN' => 2, 'CHANGED' => 2, + 'CHARSET' => 2, 'COLUMNS' => 2, 'COMMENT' => 2, 'COMPACT' => 2, 'CONTEXT' => 2, + 'CURRENT' => 2, 'DEFINER' => 2, 'DISABLE' => 2, 'DISCARD' => 2, 'DYNAMIC' => 2, + 'ENGINES' => 2, 'EXECUTE' => 2, 'GENERAL' => 2, 'HANDLER' => 2, 'INDEXES' => 2, + 'INSTALL' => 2, 'INVOKER' => 2, 'LOGFILE' => 2, 'MIGRATE' => 2, 'NO_WAIT' => 2, + 'OPTIONS' => 2, 'PARTIAL' => 2, 'PLUGINS' => 2, 'POLYGON' => 2, 'PREPARE' => 2, + 'PROFILE' => 2, 'QUARTER' => 2, 'REBUILD' => 2, 'RECOVER' => 2, 'RESTORE' => 2, + 'RETURNS' => 2, 'REVERSE' => 2, 'ROUTINE' => 2, 'SESSION' => 2, 'STORAGE' => 2, + 'SUBJECT' => 2, 'SUSPEND' => 2, 'UNICODE' => 2, 'UNKNOWN' => 2, 'UPGRADE' => 2, + 'USE_FRM' => 2, 'WRAPPER' => 2, + 'CASCADED' => 2, 'CHECKSUM' => 2, 'COALESCE' => 2, 'CONTAINS' => 2, + 'DATAFILE' => 2, 'DATETIME' => 2, 'DUMPFILE' => 2, 'EXCHANGE' => 2, + 'EXTENDED' => 2, 'FUNCTION' => 2, 'GEOMETRY' => 2, 'LANGUAGE' => 2, + 'MAX_ROWS' => 2, 'MAX_SIZE' => 2, 'MIN_ROWS' => 2, 'NATIONAL' => 2, + 'NVARCHAR' => 2, 'ONE_SHOT' => 2, 'PASSWORD' => 2, 'PRESERVE' => 2, + 'PROFILES' => 2, 'REDOFILE' => 2, 'RELAYLOG' => 2, 'ROLLBACK' => 2, + 'SCHEDULE' => 2, 'SECURITY' => 2, 'SHUTDOWN' => 2, 'SNAPSHOT' => 2, + 'SWITCHES' => 2, 'TRIGGERS' => 2, 'TRUNCATE' => 2, 'UNDOFILE' => 2, + 'WARNINGS' => 2, + 'AGGREGATE' => 2, 'ALGORITHM' => 2, 'COLLATION' => 2, 'COMMITTED' => 2, + 'DIRECTORY' => 2, 'DUPLICATE' => 2, 'EXPANSION' => 2, 'IO_THREAD' => 2, + 'ISOLATION' => 2, 'NODEGROUP' => 2, 'PACK_KEYS' => 2, 'READ_ONLY' => 2, + 'REDUNDANT' => 2, 'ROW_COUNT' => 2, 'SAVEPOINT' => 2, 'SQL_CACHE' => 2, + 'TEMPORARY' => 2, 'TEMPTABLE' => 2, 'TIMESTAMP' => 2, 'UNDEFINED' => 2, + 'UNINSTALL' => 2, 'VARIABLES' => 2, + 'COMPLETION' => 2, 'COMPRESSED' => 2, 'CONCURRENT' => 2, 'CONNECTION' => 2, + 'CONSISTENT' => 2, 'DEALLOCATE' => 2, 'GET_FORMAT' => 2, 'IDENTIFIED' => 2, + 'LINESTRING' => 2, 'MASTER_SSL' => 2, 'MULTIPOINT' => 2, 'NDBCLUSTER' => 2, + 'PARTITIONS' => 2, 'PLUGIN_DIR' => 2, 'PRIVILEGES' => 2, 'REORGANIZE' => 2, + 'REPEATABLE' => 2, 'ROW_FORMAT' => 2, 'SQL_THREAD' => 2, 'TABLESPACE' => 2, + 'TABLE_NAME' => 2, + 'COLUMN_NAME' => 2, 'CURSOR_NAME' => 2, 'DIAGNOSTICS' => 2, 'EXTENT_SIZE' => 2, + 'MASTER_HOST' => 2, 'MASTER_PORT' => 2, 'MASTER_USER' => 2, 'MICROSECOND' => 2, + 'MYSQL_ERRNO' => 2, 'PROCESSLIST' => 2, 'REPLICATION' => 2, 'SCHEMA_NAME' => 2, + 'SQL_TSI_DAY' => 2, 'TRANSACTION' => 2, 'UNCOMMITTED' => 2, + 'CATALOG_NAME' => 2, 'CLASS_ORIGIN' => 2, 'CONTRIBUTORS' => 2, + 'DEFAULT_AUTH' => 2, 'DES_KEY_FILE' => 2, 'INITIAL_SIZE' => 2, + 'MASTER_DELAY' => 2, 'MESSAGE_TEXT' => 2, 'MULTIPOLYGON' => 2, + 'OLD_PASSWORD' => 2, 'PARTITIONING' => 2, 'RELAY_THREAD' => 2, + 'SERIALIZABLE' => 2, 'SQL_NO_CACHE' => 2, 'SQL_TSI_HOUR' => 2, + 'SQL_TSI_WEEK' => 2, 'SQL_TSI_YEAR' => 2, 'SUBPARTITION' => 2, + 'TIMESTAMPADD' => 2, + 'COLUMN_FORMAT' => 2, 'INSERT_METHOD' => 2, 'MASTER_SSL_CA' => 2, + 'RELAY_LOG_POS' => 2, 'SQL_TSI_MONTH' => 2, 'SUBPARTITIONS' => 2, + 'TIMESTAMPDIFF' => 2, 'WEIGHT_STRING' => 2, + 'AUTO_INCREMENT' => 2, 'AVG_ROW_LENGTH' => 2, 'KEY_BLOCK_SIZE' => 2, + 'MASTER_LOG_POS' => 2, 'MASTER_SSL_CRL' => 2, 'MASTER_SSL_KEY' => 2, + 'RELAY_LOG_FILE' => 2, 'SQL_TSI_MINUTE' => 2, 'SQL_TSI_SECOND' => 2, + 'TABLE_CHECKSUM' => 2, 'USER_RESOURCES' => 2, + 'AUTOEXTEND_SIZE' => 2, 'CONSTRAINT_NAME' => 2, 'DELAY_KEY_WRITE' => 2, + 'MASTER_LOG_FILE' => 2, 'MASTER_PASSWORD' => 2, 'MASTER_SSL_CERT' => 2, + 'MULTILINESTRING' => 2, 'SQL_AFTER_GTIDS' => 2, 'SQL_TSI_QUARTER' => 2, + 'SUBCLASS_ORIGIN' => 2, + 'MASTER_SERVER_ID' => 2, 'REDO_BUFFER_SIZE' => 2, 'SQL_BEFORE_GTIDS' => 2, + 'STATS_PERSISTENT' => 2, 'UNDO_BUFFER_SIZE' => 2, + 'CONSTRAINT_SCHEMA' => 2, 'IGNORE_SERVER_IDS' => 2, 'MASTER_SSL_CAPATH' => 2, + 'MASTER_SSL_CIPHER' => 2, 'RETURNED_SQLSTATE' => 2, 'SQL_BUFFER_RESULT' => 2, + 'STATS_AUTO_RECALC' => 2, + 'CONSTRAINT_CATALOG' => 2, 'GEOMETRYCOLLECTION' => 2, 'MASTER_RETRY_COUNT' => 2, + 'MASTER_SSL_CRLPATH' => 2, 'SQL_AFTER_MTS_GAPS' => 2, 'STATS_SAMPLE_PAGES' => 2, + 'MASTER_AUTO_POSITION' => 2, 'MASTER_CONNECT_RETRY' => 2, + 'MAX_QUERIES_PER_HOUR' => 2, 'MAX_UPDATES_PER_HOUR' => 2, + 'MAX_USER_CONNECTIONS' => 2, + 'MASTER_HEARTBEAT_PERIOD' => 2, + 'MAX_CONNECTIONS_PER_HOUR' => 2, + + 'NOT NULL' => 4, + 'INDEX KEY' => 4, + 'UNIQUE KEY' => 4, + 'FOREIGN KEY' => 4, 'PRIMARY KEY' => 4, 'PRIMARY KEY' => 4, 'SPATIAL KEY' => 4, + 'FULLTEXT KEY' => 4, 'UNIQUE INDEX' => 4, + 'CHARACTER SET' => 4, 'IF NOT EXISTS' => 4, 'SPATIAL INDEX' => 4, + 'DATA DIRECTORY' => 4, 'FULLTEXT INDEX' => 4, + 'DEFAULT COLLATE' => 4, 'INDEX DIRECTORY' => 4, + 'DEFAULT CHARACTER SET' => 4, + + ); +} diff --git a/libraries/sql-parser/src/Contexts/Context_MySQL50700.php b/libraries/sql-parser/src/Contexts/Context_MySQL50700.php new file mode 100644 index 0000000000..578da8982b --- /dev/null +++ b/libraries/sql-parser/src/Contexts/Context_MySQL50700.php @@ -0,0 +1,199 @@ + 1, 'BY' => 1, 'IF' => 1, 'IN' => 1, 'IS' => 1, + 'ON' => 1, 'OR' => 1, 'TO' => 1, + 'ADD' => 1, 'ALL' => 1, 'AND' => 1, 'ASC' => 1, 'DEC' => 1, + 'DIV' => 1, 'FOR' => 1, 'GET' => 1, 'INT' => 1, 'KEY' => 1, + 'MOD' => 1, 'NOT' => 1, 'OUT' => 1, 'SET' => 1, 'SQL' => 1, + 'SSL' => 1, 'USE' => 1, 'XOR' => 1, + 'BLOB' => 1, 'BOTH' => 1, 'CALL' => 1, 'CASE' => 1, + 'CHAR' => 1, 'DESC' => 1, 'DROP' => 1, 'DUAL' => 1, + 'EACH' => 1, 'ELSE' => 1, 'EXIT' => 1, 'FROM' => 1, + 'INT1' => 1, 'INT2' => 1, 'INT3' => 1, 'INT4' => 1, + 'INT8' => 1, 'INTO' => 1, 'JOIN' => 1, 'KEYS' => 1, + 'KILL' => 1, 'LEFT' => 1, 'LIKE' => 1, 'LOAD' => 1, + 'LOCK' => 1, 'LONG' => 1, 'LOOP' => 1, 'NULL' => 1, + 'READ' => 1, 'REAL' => 1, 'SHOW' => 1, 'THEN' => 1, + 'TRUE' => 1, 'UNDO' => 1, 'WHEN' => 1, 'WITH' => 1, + 'ALTER' => 1, 'CHECK' => 1, 'CROSS' => 1, 'FALSE' => 1, + 'FETCH' => 1, 'FLOAT' => 1, 'FORCE' => 1, 'GRANT' => 1, + 'GROUP' => 1, 'INDEX' => 1, 'INNER' => 1, 'INOUT' => 1, + 'LEAVE' => 1, 'LIMIT' => 1, 'LINES' => 1, 'MATCH' => 1, + 'ORDER' => 1, 'OUTER' => 1, 'PURGE' => 1, 'RANGE' => 1, + 'READS' => 1, 'RIGHT' => 1, 'RLIKE' => 1, 'TABLE' => 1, + 'UNION' => 1, 'USAGE' => 1, 'USING' => 1, 'WHERE' => 1, + 'WHILE' => 1, 'WRITE' => 1, + 'BEFORE' => 1, 'BIGINT' => 1, 'BINARY' => 1, 'CHANGE' => 1, + 'COLUMN' => 1, 'CREATE' => 1, 'CURSOR' => 1, 'DELETE' => 1, + 'DOUBLE' => 1, 'ELSEIF' => 1, 'EXISTS' => 1, 'FLOAT4' => 1, + 'FLOAT8' => 1, 'HAVING' => 1, 'IGNORE' => 1, 'INFILE' => 1, + 'INSERT' => 1, 'LINEAR' => 1, 'OPTION' => 1, 'REGEXP' => 1, + 'RENAME' => 1, 'REPEAT' => 1, 'RETURN' => 1, 'REVOKE' => 1, + 'SCHEMA' => 1, 'SELECT' => 1, 'SIGNAL' => 1, 'STORED' => 1, + 'UNIQUE' => 1, 'UNLOCK' => 1, 'UPDATE' => 1, 'VALUES' => 1, + 'ANALYZE' => 1, 'BETWEEN' => 1, 'CASCADE' => 1, 'COLLATE' => 1, + 'CONVERT' => 1, 'DECIMAL' => 1, 'DECLARE' => 1, 'DEFAULT' => 1, + 'DELAYED' => 1, 'ESCAPED' => 1, 'EXPLAIN' => 1, 'FOREIGN' => 1, + 'INTEGER' => 1, 'ITERATE' => 1, 'LEADING' => 1, 'NATURAL' => 1, + 'NUMERIC' => 1, 'OUTFILE' => 1, 'PRIMARY' => 1, 'RELEASE' => 1, + 'REPLACE' => 1, 'REQUIRE' => 1, 'SCHEMAS' => 1, 'SPATIAL' => 1, + 'TINYINT' => 1, 'TRIGGER' => 1, 'VARCHAR' => 1, 'VARYING' => 1, + 'VIRTUAL' => 1, + 'CONTINUE' => 1, 'DATABASE' => 1, 'DAY_HOUR' => 1, + 'DESCRIBE' => 1, 'DISTINCT' => 1, 'ENCLOSED' => 1, + 'FULLTEXT' => 1, 'INTERVAL' => 1, 'LONGBLOB' => 1, + 'LONGTEXT' => 1, 'MAXVALUE' => 1, 'MODIFIES' => 1, + 'OPTIMIZE' => 1, 'RESIGNAL' => 1, 'RESTRICT' => 1, + 'SMALLINT' => 1, 'SPECIFIC' => 1, 'SQLSTATE' => 1, + 'STARTING' => 1, 'TINYBLOB' => 1, 'TINYTEXT' => 1, + 'TRAILING' => 1, 'UNSIGNED' => 1, 'UTC_DATE' => 1, + 'UTC_TIME' => 1, 'ZEROFILL' => 1, + 'CHARACTER' => 1, 'CONDITION' => 1, 'DATABASES' => 1, + 'GENERATED' => 1, 'LOCALTIME' => 1, 'MEDIUMINT' => 1, + 'MIDDLEINT' => 1, 'PARTITION' => 1, 'PRECISION' => 1, + 'PROCEDURE' => 1, 'SENSITIVE' => 1, 'SEPARATOR' => 1, + 'VARBINARY' => 1, + 'ACCESSIBLE' => 1, 'ASENSITIVE' => 1, 'CONSTRAINT' => 1, + 'DAY_MINUTE' => 1, 'DAY_SECOND' => 1, 'MEDIUMBLOB' => 1, + 'MEDIUMTEXT' => 1, 'OPTIONALLY' => 1, 'READ_WRITE' => 1, + 'REFERENCES' => 1, 'SQLWARNING' => 1, 'TERMINATED' => 1, + 'YEAR_MONTH' => 1, + 'DISTINCTROW' => 1, 'HOUR_MINUTE' => 1, 'HOUR_SECOND' => 1, + 'INSENSITIVE' => 1, 'MASTER_BIND' => 1, + 'CURRENT_DATE' => 1, 'CURRENT_TIME' => 1, 'CURRENT_USER' => 1, + 'LOW_PRIORITY' => 1, 'SQLEXCEPTION' => 1, 'VARCHARACTER' => 1, + 'DETERMINISTIC' => 1, 'HIGH_PRIORITY' => 1, 'MINUTE_SECOND' => 1, + 'STRAIGHT_JOIN' => 1, 'UTC_TIMESTAMP' => 1, + 'IO_AFTER_GTIDS' => 1, 'LOCALTIMESTAMP' => 1, 'SQL_BIG_RESULT' => 1, + 'DAY_MICROSECOND' => 1, 'IO_BEFORE_GTIDS' => 1, 'OPTIMIZER_COSTS' => 1, + 'HOUR_MICROSECOND' => 1, 'SQL_SMALL_RESULT' => 1, + 'CURRENT_TIMESTAMP' => 1, + 'MINUTE_MICROSECOND' => 1, 'NO_WRITE_TO_BINLOG' => 1, + 'SECOND_MICROSECOND' => 1, + 'SQL_CALC_FOUND_ROWS' => 1, + 'MASTER_SSL_VERIFY_SERVER_CERT' => 1, + + 'AT' => 2, 'DO' => 2, 'IO' => 2, 'NO' => 2, 'XA' => 2, + 'ANY' => 2, 'AVG' => 2, 'BIT' => 2, 'CPU' => 2, 'DAY' => 2, 'END' => 2, + 'IPC' => 2, 'NDB' => 2, 'NEW' => 2, 'ONE' => 2, 'ROW' => 2, 'XID' => 2, + 'XML' => 2, + 'BOOL' => 2, 'BYTE' => 2, 'CODE' => 2, 'CUBE' => 2, 'DATA' => 2, 'DATE' => 2, + 'DISK' => 2, 'ENDS' => 2, 'ENUM' => 2, 'FAST' => 2, 'FILE' => 2, 'FULL' => 2, + 'HASH' => 2, 'HELP' => 2, 'HOST' => 2, 'HOUR' => 2, 'LAST' => 2, 'LESS' => 2, + 'LIST' => 2, 'LOGS' => 2, 'MODE' => 2, 'NAME' => 2, 'NEXT' => 2, 'NONE' => 2, + 'ONLY' => 2, 'OPEN' => 2, 'PAGE' => 2, 'PORT' => 2, 'PREV' => 2, 'ROWS' => 2, + 'SLOW' => 2, 'SOME' => 2, 'STOP' => 2, 'TEXT' => 2, 'THAN' => 2, 'TIME' => 2, + 'TYPE' => 2, 'USER' => 2, 'VIEW' => 2, 'WAIT' => 2, 'WEEK' => 2, 'WORK' => 2, + 'X509' => 2, 'YEAR' => 2, + 'AFTER' => 2, 'ASCII' => 2, 'BEGIN' => 2, 'BLOCK' => 2, 'BTREE' => 2, + 'CACHE' => 2, 'CHAIN' => 2, 'CLOSE' => 2, 'ERROR' => 2, 'EVENT' => 2, + 'EVERY' => 2, 'FIRST' => 2, 'FIXED' => 2, 'FLUSH' => 2, 'FOUND' => 2, + 'HOSTS' => 2, 'LEVEL' => 2, 'LOCAL' => 2, 'LOCKS' => 2, 'MERGE' => 2, + 'MONTH' => 2, 'MUTEX' => 2, 'NAMES' => 2, 'NCHAR' => 2, 'NEVER' => 2, + 'OWNER' => 2, 'PHASE' => 2, 'POINT' => 2, 'PROXY' => 2, 'QUERY' => 2, + 'QUICK' => 2, 'RELAY' => 2, 'RESET' => 2, 'RTREE' => 2, 'SHARE' => 2, + 'SLAVE' => 2, 'START' => 2, 'SUPER' => 2, 'SWAPS' => 2, 'TYPES' => 2, + 'UNTIL' => 2, 'VALUE' => 2, + 'ACTION' => 2, 'ALWAYS' => 2, 'BACKUP' => 2, 'BINLOG' => 2, 'CIPHER' => 2, + 'CLIENT' => 2, 'COMMIT' => 2, 'ENABLE' => 2, 'ENGINE' => 2, 'ERRORS' => 2, + 'ESCAPE' => 2, 'EVENTS' => 2, 'EXPIRE' => 2, 'EXPORT' => 2, 'FAULTS' => 2, + 'FIELDS' => 2, 'FILTER' => 2, 'FORMAT' => 2, 'GLOBAL' => 2, 'GRANTS' => 2, + 'IMPORT' => 2, 'ISSUER' => 2, 'LEAVES' => 2, 'MASTER' => 2, 'MEDIUM' => 2, + 'MEMORY' => 2, 'MINUTE' => 2, 'MODIFY' => 2, 'NUMBER' => 2, 'OFFSET' => 2, + 'PARSER' => 2, 'PLUGIN' => 2, 'RELOAD' => 2, 'REMOVE' => 2, 'REPAIR' => 2, + 'RESUME' => 2, 'ROLLUP' => 2, 'SECOND' => 2, 'SERIAL' => 2, 'SERVER' => 2, + 'SIGNED' => 2, 'SIMPLE' => 2, 'SOCKET' => 2, 'SONAME' => 2, 'SOUNDS' => 2, + 'SOURCE' => 2, 'STARTS' => 2, 'STATUS' => 2, 'STRING' => 2, 'TABLES' => 2, + 'ACCOUNT' => 2, 'AGAINST' => 2, 'ANALYSE' => 2, 'BOOLEAN' => 2, 'CHANGED' => 2, + 'CHANNEL' => 2, 'CHARSET' => 2, 'COLUMNS' => 2, 'COMMENT' => 2, 'COMPACT' => 2, + 'CONTEXT' => 2, 'CURRENT' => 2, 'DEFINER' => 2, 'DISABLE' => 2, 'DISCARD' => 2, + 'DYNAMIC' => 2, 'ENGINES' => 2, 'EXECUTE' => 2, 'FOLLOWS' => 2, 'GENERAL' => 2, + 'HANDLER' => 2, 'INDEXES' => 2, 'INSTALL' => 2, 'INVOKER' => 2, 'LOGFILE' => 2, + 'MIGRATE' => 2, 'NO_WAIT' => 2, 'OPTIONS' => 2, 'PARTIAL' => 2, 'PLUGINS' => 2, + 'POLYGON' => 2, 'PREPARE' => 2, 'PROFILE' => 2, 'QUARTER' => 2, 'REBUILD' => 2, + 'RECOVER' => 2, 'RESTORE' => 2, 'RETURNS' => 2, 'REVERSE' => 2, 'ROUTINE' => 2, + 'SESSION' => 2, 'STACKED' => 2, 'STORAGE' => 2, 'SUBJECT' => 2, 'SUSPEND' => 2, + 'UNICODE' => 2, 'UNKNOWN' => 2, 'UPGRADE' => 2, 'USE_FRM' => 2, 'WITHOUT' => 2, + 'WRAPPER' => 2, + 'CASCADED' => 2, 'CHECKSUM' => 2, 'COALESCE' => 2, 'CONTAINS' => 2, + 'DATAFILE' => 2, 'DATETIME' => 2, 'DUMPFILE' => 2, 'EXCHANGE' => 2, + 'EXTENDED' => 2, 'FUNCTION' => 2, 'GEOMETRY' => 2, 'LANGUAGE' => 2, + 'MAX_ROWS' => 2, 'MAX_SIZE' => 2, 'MIN_ROWS' => 2, 'NATIONAL' => 2, + 'NVARCHAR' => 2, 'PASSWORD' => 2, 'PRECEDES' => 2, 'PRESERVE' => 2, + 'PROFILES' => 2, 'REDOFILE' => 2, 'RELAYLOG' => 2, 'ROLLBACK' => 2, + 'SCHEDULE' => 2, 'SECURITY' => 2, 'SHUTDOWN' => 2, 'SNAPSHOT' => 2, + 'SWITCHES' => 2, 'TRIGGERS' => 2, 'TRUNCATE' => 2, 'UNDOFILE' => 2, + 'WARNINGS' => 2, + 'AGGREGATE' => 2, 'ALGORITHM' => 2, 'COLLATION' => 2, 'COMMITTED' => 2, + 'DIRECTORY' => 2, 'DUPLICATE' => 2, 'EXPANSION' => 2, 'IO_THREAD' => 2, + 'ISOLATION' => 2, 'NODEGROUP' => 2, 'PACK_KEYS' => 2, 'READ_ONLY' => 2, + 'REDUNDANT' => 2, 'ROW_COUNT' => 2, 'SAVEPOINT' => 2, 'SQL_CACHE' => 2, + 'TEMPORARY' => 2, 'TEMPTABLE' => 2, 'TIMESTAMP' => 2, 'UNDEFINED' => 2, + 'UNINSTALL' => 2, 'VARIABLES' => 2, + 'COMPLETION' => 2, 'COMPRESSED' => 2, 'CONCURRENT' => 2, 'CONNECTION' => 2, + 'CONSISTENT' => 2, 'DEALLOCATE' => 2, 'GET_FORMAT' => 2, 'IDENTIFIED' => 2, + 'LINESTRING' => 2, 'MASTER_SSL' => 2, 'MULTIPOINT' => 2, 'NDBCLUSTER' => 2, + 'PARTITIONS' => 2, 'PLUGIN_DIR' => 2, 'PRIVILEGES' => 2, 'REORGANIZE' => 2, + 'REPEATABLE' => 2, 'ROW_FORMAT' => 2, 'SQL_THREAD' => 2, 'TABLESPACE' => 2, + 'TABLE_NAME' => 2, 'VALIDATION' => 2, + 'COLUMN_NAME' => 2, 'COMPRESSION' => 2, 'CURSOR_NAME' => 2, 'DIAGNOSTICS' => 2, + 'EXTENT_SIZE' => 2, 'MASTER_HOST' => 2, 'MASTER_PORT' => 2, 'MASTER_USER' => 2, + 'MICROSECOND' => 2, 'MYSQL_ERRNO' => 2, 'NONBLOCKING' => 2, 'PROCESSLIST' => 2, + 'REPLICATION' => 2, 'SCHEMA_NAME' => 2, 'SQL_TSI_DAY' => 2, 'TRANSACTION' => 2, + 'UNCOMMITTED' => 2, + 'CATALOG_NAME' => 2, 'CLASS_ORIGIN' => 2, 'DEFAULT_AUTH' => 2, + 'DES_KEY_FILE' => 2, 'INITIAL_SIZE' => 2, 'MASTER_DELAY' => 2, + 'MESSAGE_TEXT' => 2, 'MULTIPOLYGON' => 2, 'OLD_PASSWORD' => 2, + 'PARTITIONING' => 2, 'RELAY_THREAD' => 2, 'SERIALIZABLE' => 2, + 'SQL_NO_CACHE' => 2, 'SQL_TSI_HOUR' => 2, 'SQL_TSI_WEEK' => 2, + 'SQL_TSI_YEAR' => 2, 'SUBPARTITION' => 2, 'TIMESTAMPADD' => 2, + 'COLUMN_FORMAT' => 2, 'INSERT_METHOD' => 2, 'MASTER_SSL_CA' => 2, + 'RELAY_LOG_POS' => 2, 'SQL_TSI_MONTH' => 2, 'SUBPARTITIONS' => 2, + 'TIMESTAMPDIFF' => 2, 'WEIGHT_STRING' => 2, + 'AUTO_INCREMENT' => 2, 'AVG_ROW_LENGTH' => 2, 'KEY_BLOCK_SIZE' => 2, + 'MASTER_LOG_POS' => 2, 'MASTER_SSL_CRL' => 2, 'MASTER_SSL_KEY' => 2, + 'RELAY_LOG_FILE' => 2, 'SQL_TSI_MINUTE' => 2, 'SQL_TSI_SECOND' => 2, + 'TABLE_CHECKSUM' => 2, 'USER_RESOURCES' => 2, + 'AUTOEXTEND_SIZE' => 2, 'CONSTRAINT_NAME' => 2, 'DELAY_KEY_WRITE' => 2, + 'FILE_BLOCK_SIZE' => 2, 'MASTER_LOG_FILE' => 2, 'MASTER_PASSWORD' => 2, + 'MASTER_SSL_CERT' => 2, 'MULTILINESTRING' => 2, 'PARSE_GCOL_EXPR' => 2, + 'REPLICATE_DO_DB' => 2, 'SQL_AFTER_GTIDS' => 2, 'SQL_TSI_QUARTER' => 2, + 'SUBCLASS_ORIGIN' => 2, + 'MASTER_SERVER_ID' => 2, 'REDO_BUFFER_SIZE' => 2, 'SQL_BEFORE_GTIDS' => 2, + 'STATS_PERSISTENT' => 2, 'UNDO_BUFFER_SIZE' => 2, + 'CONSTRAINT_SCHEMA' => 2, 'GROUP_REPLICATION' => 2, 'IGNORE_SERVER_IDS' => 2, + 'MASTER_SSL_CAPATH' => 2, 'MASTER_SSL_CIPHER' => 2, 'RETURNED_SQLSTATE' => 2, + 'SQL_BUFFER_RESULT' => 2, 'STATS_AUTO_RECALC' => 2, + 'CONSTRAINT_CATALOG' => 2, 'GEOMETRYCOLLECTION' => 2, 'MASTER_RETRY_COUNT' => 2, + 'MASTER_SSL_CRLPATH' => 2, 'MAX_STATEMENT_TIME' => 2, 'REPLICATE_DO_TABLE' => 2, + 'SQL_AFTER_MTS_GAPS' => 2, 'STATS_SAMPLE_PAGES' => 2, + 'REPLICATE_IGNORE_DB' => 2, + 'MASTER_AUTO_POSITION' => 2, 'MASTER_CONNECT_RETRY' => 2, + 'MAX_QUERIES_PER_HOUR' => 2, 'MAX_UPDATES_PER_HOUR' => 2, + 'MAX_USER_CONNECTIONS' => 2, 'REPLICATE_REWRITE_DB' => 2, + 'REPLICATE_IGNORE_TABLE' => 2, + 'MASTER_HEARTBEAT_PERIOD' => 2, 'REPLICATE_WILD_DO_TABLE' => 2, + 'MAX_CONNECTIONS_PER_HOUR' => 2, + 'REPLICATE_WILD_IGNORE_TABLE' => 2, + + 'NOT NULL' => 4, + 'INDEX KEY' => 4, + 'UNIQUE KEY' => 4, + 'FOREIGN KEY' => 4, 'PRIMARY KEY' => 4, 'PRIMARY KEY' => 4, 'SPATIAL KEY' => 4, + 'FULLTEXT KEY' => 4, 'UNIQUE INDEX' => 4, + 'CHARACTER SET' => 4, 'IF NOT EXISTS' => 4, 'SPATIAL INDEX' => 4, + 'DATA DIRECTORY' => 4, 'FULLTEXT INDEX' => 4, + 'DEFAULT COLLATE' => 4, 'INDEX DIRECTORY' => 4, + 'DEFAULT CHARACTER SET' => 4, + + ); +} diff --git a/libraries/sql-parser/src/Exceptions/LexerException.php b/libraries/sql-parser/src/Exceptions/LexerException.php index f346d83dca..306c8b924d 100644 --- a/libraries/sql-parser/src/Exceptions/LexerException.php +++ b/libraries/sql-parser/src/Exceptions/LexerException.php @@ -27,14 +27,14 @@ class LexerException extends \Exception /** * Constructor. * - * @param string $message - * @param string $ch - * @param int $positiion - * @param int $code + * @param string $msg The message of this exception. + * @param string $ch The character that produced this exception. + * @param int $pos The position of the character. + * @param int $code The code of this error. */ - public function __construct($message = '', $ch = '', $pos = 0, $code = 0) + public function __construct($msg = '', $ch = '', $pos = 0, $code = 0) { - parent::__construct($message, $code); + parent::__construct($msg, $code); $this->ch = $ch; $this->pos = $pos; } diff --git a/libraries/sql-parser/src/Exceptions/ParserException.php b/libraries/sql-parser/src/Exceptions/ParserException.php index e23d03daf7..7332674452 100644 --- a/libraries/sql-parser/src/Exceptions/ParserException.php +++ b/libraries/sql-parser/src/Exceptions/ParserException.php @@ -20,13 +20,13 @@ class ParserException extends \Exception /** * Constructor. * - * @param string $message - * @param Token $token - * @param int $code + * @param string $msg The message of this exception. + * @param Token $token The token that produced this exception. + * @param int $code The code of this error. */ - public function __construct($message = '', Token $token = null, $code = 0) + public function __construct($msg = '', Token $token = null, $code = 0) { - parent::__construct($message, $code); + parent::__construct($msg, $code); $this->token = $token; } } diff --git a/libraries/sql-parser/src/Fragment.php b/libraries/sql-parser/src/Fragment.php index e9a4620527..63af280f26 100644 --- a/libraries/sql-parser/src/Fragment.php +++ b/libraries/sql-parser/src/Fragment.php @@ -9,20 +9,12 @@ namespace SqlParser; abstract class Fragment { - /** - * Array which contains all tokens used to popoluate data inside this - * fragment. - * - * @var array - */ - public $tokens = array(); - /** * Parses the tokens given by the lexer in the context of the given parser. * - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return array */ diff --git a/libraries/sql-parser/src/Fragments/ArrayFragment.php b/libraries/sql-parser/src/Fragments/ArrayFragment.php index 9ff8649e34..6436823be0 100644 --- a/libraries/sql-parser/src/Fragments/ArrayFragment.php +++ b/libraries/sql-parser/src/Fragments/ArrayFragment.php @@ -15,16 +15,23 @@ class ArrayFragment extends Fragment { /** - * The array. + * The array that contains the processed value of each token. * * @var array */ public $array = array(); /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * The array that contains the unprocessed value of each token. + * + * @var array + */ + public $raw = array(); + + /** + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return ArrayFragment */ @@ -74,7 +81,7 @@ class ArrayFragment extends Fragment break; } $ret->array[] = $token->value; - $ret->tokens[] = $token; + $ret->raw[] = $token->token; $state = 2; } elseif ($state === 2) { if (($token->type !== Token::TYPE_OPERATOR) || (($token->value !== ',') && ($token->value !== ')'))) { diff --git a/libraries/sql-parser/src/Fragments/CallKeyword.php b/libraries/sql-parser/src/Fragments/CallKeyword.php index 00b7838e71..6147cf4ab2 100644 --- a/libraries/sql-parser/src/Fragments/CallKeyword.php +++ b/libraries/sql-parser/src/Fragments/CallKeyword.php @@ -29,9 +29,9 @@ class CallKeyword extends Fragment public $parameters = array(); /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return CallKeyword */ @@ -68,13 +68,11 @@ class CallKeyword extends Fragment if ($state === 0) { $ret->name = $token->value; - $ret->tokens[] = $token; $state = 1; } elseif ($state === 1) { if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '(')) { $parameters = ArrayFragment::parse($parser, $list); $ret->parameters = $parameters->array; - $ret->tokens = array_merge($ret->tokens, $parameters->tokens); } break; } diff --git a/libraries/sql-parser/src/Fragments/CreateDefFragment.php b/libraries/sql-parser/src/Fragments/CreateDefFragment.php index 708ce11b85..675ad81094 100644 --- a/libraries/sql-parser/src/Fragments/CreateDefFragment.php +++ b/libraries/sql-parser/src/Fragments/CreateDefFragment.php @@ -70,9 +70,9 @@ class CreateDefFragment extends Fragment public $name; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return CreateDefFragment */ @@ -98,7 +98,6 @@ class CreateDefFragment extends Fragment break; } - $ret->tokens[] = $token; $ret->name .= $token->value; } diff --git a/libraries/sql-parser/src/Fragments/DataTypeFragment.php b/libraries/sql-parser/src/Fragments/DataTypeFragment.php index c0a4f61a4c..ca7cfafc3b 100644 --- a/libraries/sql-parser/src/Fragments/DataTypeFragment.php +++ b/libraries/sql-parser/src/Fragments/DataTypeFragment.php @@ -18,10 +18,10 @@ class DataTypeFragment extends Fragment public static $OPTIONS = array( 'BINARY' => 1, 'CHARACTER SET' => array(2, 'var'), - 'CHARSET' => array(3, 'var'), - 'COLLATE' => 4, - 'UNSIGNED' => 5, - 'ZEROFILL' => 6, + 'CHARSET' => array(2, 'var'), + 'COLLATE' => 3, + 'UNSIGNED' => 4, + 'ZEROFILL' => 5, ); /** @@ -46,9 +46,9 @@ class DataTypeFragment extends Fragment public $options = array(); /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return DataTypeFragment[] */ @@ -80,7 +80,6 @@ class DataTypeFragment extends Fragment if ($state === 0) { $ret->name = $token->value; - $ret->tokens[] = $token; if (!isset(Context::$DATA_TYPES[$token->value])) { $parser->error('Unrecognized data type.', $token); } @@ -88,11 +87,9 @@ class DataTypeFragment extends Fragment } elseif ($state === 1) { if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '(')) { $size = ArrayFragment::parse($parser, $list); - foreach ($size->tokens as $token) { - $ret->size[] = $token->token; - } - $ret->tokens = array_merge($ret->tokens, $size->tokens); ++$list->idx; + $ret->size = (($ret->name === 'ENUM') || ($ret->name === 'SET')) ? + $size->raw : $size->array; } $ret->options = OptionsFragment::parse($parser, $list, static::$OPTIONS); ++$list->idx; diff --git a/libraries/sql-parser/src/Fragments/FieldDefFragment.php b/libraries/sql-parser/src/Fragments/FieldDefFragment.php index fe941849a5..307968133f 100644 --- a/libraries/sql-parser/src/Fragments/FieldDefFragment.php +++ b/libraries/sql-parser/src/Fragments/FieldDefFragment.php @@ -52,9 +52,9 @@ class FieldDefFragment extends Fragment /** * The array of indexes. * - * @var array + * @var ArrayFragment */ - public $indexes = array(); + public $indexes; /** * The options of the new field fragment. @@ -64,9 +64,9 @@ class FieldDefFragment extends Fragment public $options; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return FieldDefFragment[] */ @@ -124,7 +124,7 @@ class FieldDefFragment extends Fragment } continue; } elseif ($state === 1) { - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { if ($token->value === 'CONSTRAINT') { $state = 4; } elseif (isset(Context::$KEY_TYPES[$token->value])) { @@ -166,11 +166,10 @@ class FieldDefFragment extends Fragment } } - $expr->tokens[] = $token; } // Last iteration was not saved. - if (!empty($expr->tokens)) { + if (!empty($expr->name)) { $ret[] = $expr; } diff --git a/libraries/sql-parser/src/Fragments/FieldFragment.php b/libraries/sql-parser/src/Fragments/FieldFragment.php index 71e1066a65..9a69a2e9d6 100644 --- a/libraries/sql-parser/src/Fragments/FieldFragment.php +++ b/libraries/sql-parser/src/Fragments/FieldFragment.php @@ -50,9 +50,9 @@ class FieldFragment extends Fragment public $alias; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return FieldFragment */ @@ -85,7 +85,6 @@ class FieldFragment extends Fragment if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) { if (($isExpr) && (!$alias)) { $ret->expr .= $token->token; - $ret->tokens[] = $token; } if (($alias === 0) && (!$isExpr) && (!$period) && (!empty($ret->expr))) { $alias = 1; @@ -93,7 +92,7 @@ class FieldFragment extends Fragment continue; } - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { // Keywords may be found only between brackets. if ($brackets === 0) { if ($token->value === 'AS') { @@ -121,9 +120,9 @@ class FieldFragment extends Fragment } } - if (($token->type === Token::TYPE_NUMBER) || ($token->type === Token::TYPE_BOOL) || - (($token->type === Token::TYPE_SYMBOL) && ($token->flags & Token::FLAG_SYMBOL_VARIABLE)) || - (($token->type === Token::TYPE_OPERATOR)) && ($token->value !== '.')) { + if (($token->type === Token::TYPE_NUMBER) || ($token->type === Token::TYPE_BOOL) + || (($token->type === Token::TYPE_SYMBOL) && ($token->flags & Token::FLAG_SYMBOL_VARIABLE)) + || (($token->type === Token::TYPE_OPERATOR)) && ($token->value !== '.')) { // Numbers, booleans and operators are usually part of expressions. $isExpr = true; } @@ -147,15 +146,15 @@ class FieldFragment extends Fragment } } else { if ($brackets === 0) { - if (($token->type === Token::TYPE_NONE) || ($token->type === Token::TYPE_STRING) || - (($token->type === Token::TYPE_SYMBOL) && ($token->flags & Token::FLAG_SYMBOL_BACKTICK))) { + if (($token->type === Token::TYPE_NONE) || ($token->type === Token::TYPE_STRING) + || (($token->type === Token::TYPE_SYMBOL) && ($token->flags & Token::FLAG_SYMBOL_BACKTICK)) + ) { $ret->alias = $token->value; } } } $ret->expr .= $token->token; - $ret->tokens[] = $token; } } @@ -163,7 +162,7 @@ class FieldFragment extends Fragment $parser->error('Alias was expected.', $token); } - if (empty($ret->tokens)) { + if (empty($ret->expr)) { return null; } diff --git a/libraries/sql-parser/src/Fragments/FromKeyword.php b/libraries/sql-parser/src/Fragments/FromKeyword.php index fd11eea68e..c7dc624111 100644 --- a/libraries/sql-parser/src/Fragments/FromKeyword.php +++ b/libraries/sql-parser/src/Fragments/FromKeyword.php @@ -15,9 +15,9 @@ class FromKeyword extends Fragment { /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return FieldFragment[] */ @@ -42,7 +42,7 @@ class FromKeyword extends Fragment } // No keyword is expected. - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { break; } @@ -58,7 +58,7 @@ class FromKeyword extends Fragment } // Last iteration was not saved. - if (!empty($expr->tokens)) { + if ($expr !== null) { $ret[] = $expr; } diff --git a/libraries/sql-parser/src/Fragments/IntoKeyword.php b/libraries/sql-parser/src/Fragments/IntoKeyword.php index 9f6a116eab..d56293aa9f 100644 --- a/libraries/sql-parser/src/Fragments/IntoKeyword.php +++ b/libraries/sql-parser/src/Fragments/IntoKeyword.php @@ -29,9 +29,9 @@ class IntoKeyword extends Fragment public $fields; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return IntoKeyword */ @@ -69,7 +69,7 @@ class IntoKeyword extends Fragment } // No keyword is expected. - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { break; } @@ -92,7 +92,6 @@ class IntoKeyword extends Fragment break; } - $ret->tokens[] = $token; if ($state === 0) { $ret->table .= $token->value; } elseif ($state === 1) { diff --git a/libraries/sql-parser/src/Fragments/JoinKeyword.php b/libraries/sql-parser/src/Fragments/JoinKeyword.php index 62f9ecd0c0..411d227372 100644 --- a/libraries/sql-parser/src/Fragments/JoinKeyword.php +++ b/libraries/sql-parser/src/Fragments/JoinKeyword.php @@ -29,9 +29,9 @@ class JoinKeyword extends Fragment public $on; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return JoinKeyword */ diff --git a/libraries/sql-parser/src/Fragments/LimitKeyword.php b/libraries/sql-parser/src/Fragments/LimitKeyword.php index 08fb3a43ef..3e6f592c9c 100644 --- a/libraries/sql-parser/src/Fragments/LimitKeyword.php +++ b/libraries/sql-parser/src/Fragments/LimitKeyword.php @@ -29,9 +29,9 @@ class LimitKeyword extends Fragment public $row_count; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return LimitKeyword */ @@ -55,8 +55,7 @@ class LimitKeyword extends Fragment continue; } - // NOTE: `OFFSET` is not a keyword. - if (($token->type === Token::TYPE_NONE) && ($token->value === 'OFFSET')) { + if ($token->value === 'OFFSET') { if ($offset) { $parser->error('An offset was expected.'); } @@ -76,9 +75,6 @@ class LimitKeyword extends Fragment } else { $ret->row_count = $token->value; } - - $ret->tokens[] = $token; - } if ($offset) { diff --git a/libraries/sql-parser/src/Fragments/OptionsFragment.php b/libraries/sql-parser/src/Fragments/OptionsFragment.php index 22661eb989..3317f10bd5 100644 --- a/libraries/sql-parser/src/Fragments/OptionsFragment.php +++ b/libraries/sql-parser/src/Fragments/OptionsFragment.php @@ -22,9 +22,9 @@ class OptionsFragment extends Fragment public $options = array(); /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return OptionsFragment */ @@ -55,8 +55,8 @@ class OptionsFragment extends Fragment continue; } - if (isset($options[$token->value])) { - $lastOption = $options[$token->value]; + if (isset($options[strtoupper($token->value)])) { + $lastOption = $options[strtoupper($token->value)]; $lastOptionId = is_array($lastOption) ? $lastOption[0] : $lastOption; // Checking for option conflicts. @@ -78,10 +78,9 @@ class OptionsFragment extends Fragment // The only keywords that are expected are those which are // options. - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { break; } - } if (is_array($lastOption)) { @@ -105,8 +104,6 @@ class OptionsFragment extends Fragment $ret->options[$lastOptionId] = $token->value; $lastOption = null; } - $ret->tokens[] = $token; - } ksort($ret->options); diff --git a/libraries/sql-parser/src/Fragments/OrderKeyword.php b/libraries/sql-parser/src/Fragments/OrderKeyword.php index 5ddc8efb75..4cebc1c2bc 100644 --- a/libraries/sql-parser/src/Fragments/OrderKeyword.php +++ b/libraries/sql-parser/src/Fragments/OrderKeyword.php @@ -29,9 +29,9 @@ class OrderKeyword extends Fragment public $type = 'ASC'; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return OrderKeyword[] */ @@ -55,11 +55,10 @@ class OrderKeyword extends Fragment continue; } - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { // Type of ordering. By default, it is `ASC`. if (($token->value === 'ASC') || ($token->value === 'DESC')) { $expr->type = $token->value; - $expr->tokens[] = $token; continue; } @@ -74,13 +73,12 @@ class OrderKeyword extends Fragment continue; } - $expr->tokens[] = $token; $expr->column .= $token->token; } // Last iteration was not processed. - if (!empty($expr->tokens)) { + if (!empty($expr->column)) { $ret[] = $expr; } diff --git a/libraries/sql-parser/src/Fragments/ParamDefFragment.php b/libraries/sql-parser/src/Fragments/ParamDefFragment.php index b7d414d509..132898fd91 100644 --- a/libraries/sql-parser/src/Fragments/ParamDefFragment.php +++ b/libraries/sql-parser/src/Fragments/ParamDefFragment.php @@ -37,9 +37,9 @@ class ParamDefFragment extends Fragment public $type; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return ParamDefFragment[] */ @@ -112,12 +112,10 @@ class ParamDefFragment extends Fragment break; } } - - $expr->tokens[] = $token; } // Last iteration was not saved. - if (!empty($expr->tokens)) { + if (!empty($expr->name)) { $ret[] = $expr; } diff --git a/libraries/sql-parser/src/Fragments/RenameKeyword.php b/libraries/sql-parser/src/Fragments/RenameKeyword.php index 7841b2ac77..c38dae625d 100644 --- a/libraries/sql-parser/src/Fragments/RenameKeyword.php +++ b/libraries/sql-parser/src/Fragments/RenameKeyword.php @@ -29,9 +29,9 @@ class RenameKeyword extends Fragment public $new; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return RenameKeyword */ @@ -73,7 +73,7 @@ class RenameKeyword extends Fragment continue; } - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { if (($state === 1) && ($token->value === 'TO')) { $state = 2; continue; @@ -95,7 +95,6 @@ class RenameKeyword extends Fragment break; } - $expr->tokens[] = $token; if ($state == 0) { $expr->old = $token->value; $state = 1; @@ -107,7 +106,7 @@ class RenameKeyword extends Fragment } // Last iteration was not saved. - if (!empty($expr->tokens)) { + if (!empty($expr->old)) { $ret[] = $expr; } diff --git a/libraries/sql-parser/src/Fragments/SelectKeyword.php b/libraries/sql-parser/src/Fragments/SelectKeyword.php index dc8db950be..8848815bd5 100644 --- a/libraries/sql-parser/src/Fragments/SelectKeyword.php +++ b/libraries/sql-parser/src/Fragments/SelectKeyword.php @@ -15,9 +15,9 @@ class SelectKeyword extends Fragment { /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return FieldFragment[] */ @@ -41,7 +41,7 @@ class SelectKeyword extends Fragment continue; } - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { // No keyword is expected. break; } @@ -58,7 +58,7 @@ class SelectKeyword extends Fragment } // Last iteration was not processed. - if (!empty($expr->tokens)) { + if ($expr !== null) { $ret[] = $expr; } diff --git a/libraries/sql-parser/src/Fragments/SetKeyword.php b/libraries/sql-parser/src/Fragments/SetKeyword.php index 1e70f27e2d..284173eab9 100644 --- a/libraries/sql-parser/src/Fragments/SetKeyword.php +++ b/libraries/sql-parser/src/Fragments/SetKeyword.php @@ -29,9 +29,9 @@ class SetKeyword extends Fragment public $value; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return SetKeyword[] */ @@ -70,7 +70,7 @@ class SetKeyword extends Fragment } // No keyword is expected. - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { break; } @@ -85,17 +85,15 @@ class SetKeyword extends Fragment } } - $expr->tokens[] = $token; if ($state === 0) { $expr->column .= $token->value; } else { // } else if ($state === 1) { $expr->value = $token->value; } - } // Last iteration was not saved. - if (!empty($expr->tokens)) { + if (!empty($expr->column)) { $ret[] = $expr; } diff --git a/libraries/sql-parser/src/Fragments/ValuesKeyword.php b/libraries/sql-parser/src/Fragments/ValuesKeyword.php index c6bd551772..db8c5fd2f7 100644 --- a/libraries/sql-parser/src/Fragments/ValuesKeyword.php +++ b/libraries/sql-parser/src/Fragments/ValuesKeyword.php @@ -22,9 +22,9 @@ class ValuesKeyword extends Fragment public $values; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return ValuesKeyword */ @@ -68,7 +68,7 @@ class ValuesKeyword extends Fragment } // No keyword is expected. - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { break; } @@ -96,7 +96,6 @@ class ValuesKeyword extends Fragment break; } - $expr->tokens[] = $token; if ($state === 1) { $value .= $token->value; $state = 2; @@ -105,7 +104,7 @@ class ValuesKeyword extends Fragment } // Last iteration was not saved. - if (!empty($expr->tokens)) { + if (!empty($expr->values)) { $ret[] = $expr; } diff --git a/libraries/sql-parser/src/Fragments/WhereKeyword.php b/libraries/sql-parser/src/Fragments/WhereKeyword.php index 786efbfa9a..c9ce460175 100644 --- a/libraries/sql-parser/src/Fragments/WhereKeyword.php +++ b/libraries/sql-parser/src/Fragments/WhereKeyword.php @@ -36,9 +36,9 @@ class WhereKeyword extends Fragment public $condition; /** - * @param Parser $parser - * @param TokensList $list - * @param array $options + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. * * @return WhereKeyword[] */ @@ -64,14 +64,13 @@ class WhereKeyword extends Fragment // Conditions are delimited by logical operators. if (in_array($token->value, static::$OPERATORS, true)) { - if (!empty($expr->tokens)) { + if (!empty($expr->condition)) { $ret[] = $expr; } $expr = new WhereKeyword(); $expr->isOperator = true; $expr->condition = $token->value; - $epxr->tokens[] = $token; $ret[] = $expr; $expr = new WhereKeyword(); @@ -80,17 +79,16 @@ class WhereKeyword extends Fragment } // No keyword is expected. - if ($token->type === Token::TYPE_KEYWORD) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { break; } - $expr->tokens[] = $token; $expr->condition .= $token->token; } // Last iteration was not processed. - if (!empty($expr->tokens)) { + if (!empty($expr->condition)) { $ret[] = $expr; } diff --git a/libraries/sql-parser/src/Lexer.php b/libraries/sql-parser/src/Lexer.php index 2b980ab692..efd926881b 100644 --- a/libraries/sql-parser/src/Lexer.php +++ b/libraries/sql-parser/src/Lexer.php @@ -26,6 +26,12 @@ class Lexer // (ascending) and their occurance rate (descending). // // Conflicts: + // + // 1. `parseDelimiter` and `parseUnknown`, `parseKeyword`, `parseNumber` + // They fight over delimiter. The delimiter may be a keyword, a number + // or almost any character which makes the delimiter one of the first + // tokens that must be parsed. + // // 1. `parseNumber` and `parseOperator` // They fight over `+` and `-`. // @@ -38,9 +44,9 @@ class Lexer // 4. `parseKeyword` and `parseUnknown` // They fight over words. `parseUnknown` does not know about keywords. - 'parseWhitespace', 'parseNumber', 'parseComment', 'parseOperator', - 'parseBool', 'parseString', 'parseSymbol', 'parseKeyword', - 'parseUnknown' + 'parseDelimiter', 'parseWhitespace', 'parseNumber', 'parseComment', + 'parseOperator', 'parseBool', 'parseString', 'parseSymbol', + 'parseKeyword', 'parseUnknown' ); /** @@ -90,6 +96,17 @@ class Lexer */ public $delimiter = ';'; + /** + * The length of the delimiter. + * + * Because `parseDelimter` can be called a lot, it would perform a lot of + * calls to `strlen`, which might affect performance when the delimiter is + * big. + * + * @var int + */ + public $delimiterLen = 1; + /** * List of errors that occured during lexing. * @@ -106,8 +123,8 @@ class Lexer /** * Constructor. * - * @param string|UtfString $str - * @param bool $strict + * @param string|UtfString $str The query to be lexed. + * @param bool $strict Whether strict mode should be enabled or not. */ public function __construct($str, $strict = false) { @@ -120,8 +137,6 @@ class Lexer /** * Parses the string and extracts lexems. - * - * @param string|UtfString $str */ public function lex() { @@ -150,14 +165,16 @@ class Lexer if ($token === null) { // @assert($this->last === $lastIdx); $token = new Token($this->str[$this->last]); - if ($this->delimiter !== $this->str[$this->last]) { - $this->error('Unexpected character.', $this->str[$this->last], $this->last); - } - } elseif (($token->type === Token::TYPE_SYMBOL) && ($token->flags & Token::FLAG_SYMBOL_VARIABLE) && - ($lastToken !== null)) { + $this->error('Unexpected character.', $this->str[$this->last], $this->last); + } elseif (($token->type === Token::TYPE_SYMBOL) + && ($token->flags & Token::FLAG_SYMBOL_VARIABLE) + && ($lastToken !== null) + ) { // Handles ```... FROM 'user'@'%' ...```. - if ((($lastToken->type === Token::TYPE_SYMBOL) && ($lastToken->flags & Token::FLAG_SYMBOL_BACKTICK)) || - ($lastToken->type === Token::TYPE_STRING)) { + if ((($lastToken->type === Token::TYPE_SYMBOL) + && ($lastToken->flags & Token::FLAG_SYMBOL_BACKTICK)) + || ($lastToken->type === Token::TYPE_STRING) + ) { $lastToken->token .= $token->token; $lastToken->type = Token::TYPE_SYMBOL; $lastToken->flags = Token::FLAG_SYMBOL_USER; @@ -170,20 +187,39 @@ class Lexer $tokens->tokens[$tokens->count++] = $token; // Handling delimiters. - if ($this->delimiter === '') { - // Updating the delimiter. - if ($token->type !== Token::TYPE_WHITESPACE) { - $this->delimiter = $token->value; + if (($token->type === Token::TYPE_NONE) && ($token->value === 'DELIMITER')) { + if ($this->last + 1 >= $this->len) { + $this->error('Expected whitespace(s) before delimiter.', '', $this->last + 1); + continue; } - } elseif ($token->value === 'DELIMITER') { - // `DELIMITER` keyword found, looking for a delimiter. - $this->delimiter = ''; - } - // Overwriting token if delimiter. - if ($token->value === $this->delimiter) { - $token->type = Token::TYPE_DELIMITER; - $token->flags = 0; + // Skipping last R (from `delimiteR`) and whitespaces between + // the keyword `DELIMITER` and the actual delimiter. + $pos = ++$this->last; + if (($token = $this->parseWhitespace()) !== null) { + $token->position = $pos; + $tokens->tokens[$tokens->count++] = $token; + } + + // Preparing the token that holds the new delimiter. + if ($this->last + 1 >= $this->len) { + $this->error('Expected delimiter.', '', $this->last + 1); + continue; + } + $pos = $this->last + 1; + + // Parsing the delimiter. + $this->delimiter = ''; + while ((++$this->last < $this->len) && (!Context::isWhitespace($this->str[$this->last]))) { + $this->delimiter .= $this->str[$this->last]; + } + --$this->last; + + // Saving the delimiter and its token. + $this->delimiterLen = strlen($this->delimiter); + $token = new Token($this->delimiter, Token::TYPE_DELIMITER); + $token->position = $pos; + $tokens->tokens[$tokens->count++] = $token; } $lastToken = $token; @@ -199,9 +235,10 @@ class Lexer /** * Creates a new error log. * - * @param string $msg - * @param string $str - * @param int $code + * @param string $msg The error message. + * @param string $ch The character that produced the error. + * @param int $pos The position of the character. + * @param int $code The code of the error. */ public function error($msg = '', $str = '', $pos = 0, $code = 0) { @@ -230,8 +267,8 @@ class Lexer for ($j = 1; $j < Context::KEYWORD_MAX_LENGTH && $this->last < $this->len; ++$j, ++$this->last) { $token .= $this->str[$this->last]; if (($this->last + 1 === $this->len) || (Context::isSeparator($this->str[$this->last + 1]))) { - if (Context::isKeyword($token)) { - $ret = new Token($token, Token::TYPE_KEYWORD); + if (($flags = Context::isKeyword($token))) { + $ret = new Token($token, Token::TYPE_KEYWORD, $flags); $iEnd = $this->last; // We don't break so we find longest keyword. // For example, `OR` and `ORDER` have a common prefix `OR`. @@ -427,8 +464,9 @@ class Lexer } elseif ($this->str[$this->last] === '-') { $flags |= Token::FLAG_NUMBER_NEGATIVE; // Do nothing. - } elseif (($this->str[$this->last] === '0') && ($this->last + 1 < $this->len) && - (($this->str[$this->last + 1] === 'x') || ($this->str[$this->last + 1] === 'X'))) { + } elseif (($this->str[$this->last] === '0') && ($this->last + 1 < $this->len) + && (($this->str[$this->last + 1] === 'x') || ($this->str[$this->last + 1] === 'X')) + ) { $token .= $this->str[$this->last++]; $state = 2; } elseif (($this->str[$this->last] >= '0') && ($this->str[$this->last] <= '9')) { @@ -440,9 +478,10 @@ class Lexer } } elseif ($state === 2) { $flags |= Token::FLAG_NUMBER_HEX; - if ((($this->str[$this->last] >= '0') && ($this->str[$this->last] <= '9')) || - (($this->str[$this->last] >= 'A') && ($this->str[$this->last] <= 'F')) || - (($this->str[$this->last] >= 'a') && ($this->str[$this->last] <= 'f'))) { + if ((($this->str[$this->last] >= '0') && ($this->str[$this->last] <= '9')) + || (($this->str[$this->last] >= 'A') && ($this->str[$this->last] <= 'F')) + || (($this->str[$this->last] >= 'a') && ($this->str[$this->last] <= 'f')) + ) { // Do nothing. } else { break; @@ -494,7 +533,7 @@ class Lexer /** * Parses a string. * - * @param string $quote Additional start symbol. + * @param string $quote Additional starting symbol. * * @return Token */ @@ -507,9 +546,10 @@ class Lexer $quote = $token; while (++$this->last < $this->len) { - if (($this->last + 1 < $this->len) && - ((($this->str[$this->last] === $quote) && ($this->str[$this->last + 1] === $quote)) || - (($this->str[$this->last] === '\\') && ($quote !== '`')))) { + if (($this->last + 1 < $this->len) + && ((($this->str[$this->last] === $quote) && ($this->str[$this->last + 1] === $quote)) + || (($this->str[$this->last] === '\\') && ($quote !== '`'))) + ) { $token .= $this->str[$this->last] . $this->str[++$this->last]; } else { if ($this->str[$this->last] === $quote) { @@ -575,4 +615,24 @@ class Lexer --$this->last; return new Token($token); } + + /** + * Parses the delimiter of the query. + * + * @return Token + */ + public function parseDelimiter() + { + $idx = 0; + + while ($idx < $this->delimiterLen) { + if ($this->delimiter[$idx] !== $this->str[$this->last + $idx]) { + return null; + } + ++$idx; + } + + $this->last += $this->delimiterLen - 1; + return new Token($this->delimiter, Token::TYPE_DELIMITER); + } } diff --git a/libraries/sql-parser/src/Parser.php b/libraries/sql-parser/src/Parser.php index 167e9125fa..059faa52af 100644 --- a/libraries/sql-parser/src/Parser.php +++ b/libraries/sql-parser/src/Parser.php @@ -119,8 +119,8 @@ class Parser /** * Constructor. * - * @param mixed $list - * @param bool $strict + * @param mixed $list The list of tokens to be parsed. + * @param bool $strict Whether strict mode should be enabled or not. */ public function __construct($list = null, $strict = false) { @@ -181,9 +181,9 @@ class Parser /** * Creates a new error log. * - * @param string $str - * @param Token $token - * @param int $code + * @param string $msg The error message. + * @param Token $token The token that produced the error. + * @param int $code The code of the error. */ public function error($str = '', Token $token = null, $code = 0) { diff --git a/libraries/sql-parser/src/Token.php b/libraries/sql-parser/src/Token.php index 9b75c02f3e..7563d77d02 100644 --- a/libraries/sql-parser/src/Token.php +++ b/libraries/sql-parser/src/Token.php @@ -109,6 +109,9 @@ class Token const TYPE_DELIMITER = 9; // Flags that describe the tokens in more detail. + const FLAG_KEYWORD_RESERVED = 1; + const FLAG_KEYWORD_UNRESERVED = 2; + const FLAG_KEYWORD_COMPOSED = 4; // Numbers related flags. const FLAG_NUMBER_HEX = 1; @@ -200,7 +203,10 @@ class Token { switch ($this->type) { case Token::TYPE_KEYWORD: - return strtoupper($this->token); + if ($this->flags & Token::FLAG_KEYWORD_RESERVED) { + return strtoupper($this->token); + } + return $this->token; case Token::TYPE_WHITESPACE: return ' '; case Token::TYPE_BOOL: diff --git a/libraries/sql-parser/src/UtfString.php b/libraries/sql-parser/src/UtfString.php index 8815e58367..0f68cfe0cc 100644 --- a/libraries/sql-parser/src/UtfString.php +++ b/libraries/sql-parser/src/UtfString.php @@ -154,7 +154,7 @@ class UtfString implements \ArrayAccess * * @return int */ - private static function getCharLength($byte) + public static function getCharLength($byte) { $byte = ord($byte); if ($byte < 128) { diff --git a/libraries/sql-parser/src/Utils/Misc.php b/libraries/sql-parser/src/Utils/Misc.php index dc8b4386c6..473bf9bf99 100644 --- a/libraries/sql-parser/src/Utils/Misc.php +++ b/libraries/sql-parser/src/Utils/Misc.php @@ -2,7 +2,7 @@ namespace SqlParser\Utils; -use SqlParser\Statement; +use SqlParser\Statements\SelectStatement; class Misc { @@ -10,12 +10,12 @@ class Misc /** * Gets a list of all aliases and their original names. * - * @param Statement $tree + * @param SelectStatement $tree The tree that was generated after parsing. * @param string $db * * @return array */ - public static function getAliases($tree, $db) + public static function getAliases(SelectStatement $tree, $db) { $retval = array(); diff --git a/libraries/sql-parser/src/Utils/Routine.php b/libraries/sql-parser/src/Utils/Routine.php index 126ed539f0..36511ca529 100644 --- a/libraries/sql-parser/src/Utils/Routine.php +++ b/libraries/sql-parser/src/Utils/Routine.php @@ -4,9 +4,9 @@ namespace SqlParser\Utils; use SqlParser\Lexer; use SqlParser\Parser; -use SqlParser\Statement; use SqlParser\Fragments\DataTypeFragment; use SqlParser\Fragments\ParamDefFragment; +use SqlParser\Statements\CreateStatement; class Routine { @@ -80,11 +80,11 @@ class Routine /** * Gets the parameters of a routine from the parse tree. * - * @param Statement $tree + * @param CreateStatement $tree The tree that was generated after parsing. * * @return array */ - public static function getParameters(Statement $tree) + public static function getParameters(CreateStatement $tree) { $retval = array( 'num' => 0,