diff -r 48d210e41c65 -r 54c5cfbb1e29 eric6/ThirdParty/Pygments/pygments/lexers/_mysql_builtins.py --- a/eric6/ThirdParty/Pygments/pygments/lexers/_mysql_builtins.py Thu Jan 14 18:06:56 2021 +0100 +++ b/eric6/ThirdParty/Pygments/pygments/lexers/_mysql_builtins.py Thu Jan 14 18:14:15 2021 +0100 @@ -1,1282 +1,1282 @@ -# -*- coding: utf-8 -*- -""" - pygments.lexers._mysql_builtins - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Self-updating data files for the MySQL lexer. - - :copyright: Copyright 2020 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - - -MYSQL_CONSTANTS = ( - 'false', - 'null', - 'true', - 'unknown', -) - - -# At this time, no easily-parsed, definitive list of data types -# has been found in the MySQL source code or documentation. (The -# `sql/sql_yacc.yy` file is definitive but is difficult to parse.) -# Therefore these types are currently maintained manually. -# -# Some words in this list -- like "long", "national", "precision", -# and "varying" -- appear to only occur in combination with other -# data type keywords. Therefore they are included as separate words -# even though they do not naturally occur in syntax separately. -# -# This list is also used to strip data types out of the list of -# MySQL keywords, which is automatically updated later in the file. -# -MYSQL_DATATYPES = ( - # Numeric data types - 'bigint', - 'bit', - 'bool', - 'boolean', - 'dec', - 'decimal', - 'double', - 'fixed', - 'float', - 'float4', - 'float8', - 'int', - 'int1', - 'int2', - 'int3', - 'int4', - 'int8', - 'integer', - 'mediumint', - 'middleint', - 'numeric', - 'precision', - 'real', - 'serial', - 'smallint', - 'tinyint', - - # Date and time data types - 'date', - 'datetime', - 'time', - 'timestamp', - 'year', - - # String data types - 'binary', - 'blob', - 'char', - 'enum', - 'long', - 'longblob', - 'longtext', - 'mediumblob', - 'mediumtext', - 'national', - 'nchar', - 'nvarchar', - 'set', - 'text', - 'tinyblob', - 'tinytext', - 'varbinary', - 'varchar', - 'varcharacter', - 'varying', - - # Spatial data types - 'geometry', - 'geometrycollection', - 'linestring', - 'multilinestring', - 'multipoint', - 'multipolygon', - 'point', - 'polygon', - - # JSON data types - 'json', -) - -# Everything below this line is auto-generated from the MySQL source code. -# Run this file in Python and it will update itself. -# ----------------------------------------------------------------------------- - -MYSQL_FUNCTIONS = ( - 'abs', - 'acos', - 'adddate', - 'addtime', - 'aes_decrypt', - 'aes_encrypt', - 'any_value', - 'asin', - 'atan', - 'atan2', - 'benchmark', - 'bin', - 'bin_to_uuid', - 'bit_and', - 'bit_count', - 'bit_length', - 'bit_or', - 'bit_xor', - 'can_access_column', - 'can_access_database', - 'can_access_event', - 'can_access_resource_group', - 'can_access_routine', - 'can_access_table', - 'can_access_trigger', - 'can_access_view', - 'cast', - 'ceil', - 'ceiling', - 'char_length', - 'character_length', - 'coercibility', - 'compress', - 'concat', - 'concat_ws', - 'connection_id', - 'conv', - 'convert_cpu_id_mask', - 'convert_interval_to_user_interval', - 'convert_tz', - 'cos', - 'cot', - 'count', - 'crc32', - 'curdate', - 'current_role', - 'curtime', - 'date_add', - 'date_format', - 'date_sub', - 'datediff', - 'dayname', - 'dayofmonth', - 'dayofweek', - 'dayofyear', - 'degrees', - 'elt', - 'exp', - 'export_set', - 'extract', - 'extractvalue', - 'field', - 'find_in_set', - 'floor', - 'format_bytes', - 'format_pico_time', - 'found_rows', - 'from_base64', - 'from_days', - 'from_unixtime', - 'get_dd_column_privileges', - 'get_dd_create_options', - 'get_dd_index_private_data', - 'get_dd_index_sub_part_length', - 'get_dd_property_key_value', - 'get_dd_tablespace_private_data', - 'get_lock', - 'greatest', - 'group_concat', - 'gtid_subset', - 'gtid_subtract', - 'hex', - 'icu_version', - 'ifnull', - 'inet6_aton', - 'inet6_ntoa', - 'inet_aton', - 'inet_ntoa', - 'instr', - 'internal_auto_increment', - 'internal_avg_row_length', - 'internal_check_time', - 'internal_checksum', - 'internal_data_free', - 'internal_data_length', - 'internal_dd_char_length', - 'internal_get_comment_or_error', - 'internal_get_dd_column_extra', - 'internal_get_enabled_role_json', - 'internal_get_hostname', - 'internal_get_mandatory_roles_json', - 'internal_get_partition_nodegroup', - 'internal_get_username', - 'internal_get_view_warning_or_error', - 'internal_index_column_cardinality', - 'internal_index_length', - 'internal_is_enabled_role', - 'internal_is_mandatory_role', - 'internal_keys_disabled', - 'internal_max_data_length', - 'internal_table_rows', - 'internal_tablespace_autoextend_size', - 'internal_tablespace_data_free', - 'internal_tablespace_extent_size', - 'internal_tablespace_extra', - 'internal_tablespace_free_extents', - 'internal_tablespace_id', - 'internal_tablespace_initial_size', - 'internal_tablespace_logfile_group_name', - 'internal_tablespace_logfile_group_number', - 'internal_tablespace_maximum_size', - 'internal_tablespace_row_format', - 'internal_tablespace_status', - 'internal_tablespace_total_extents', - 'internal_tablespace_type', - 'internal_tablespace_version', - 'internal_update_time', - 'is_free_lock', - 'is_ipv4', - 'is_ipv4_compat', - 'is_ipv4_mapped', - 'is_ipv6', - 'is_used_lock', - 'is_uuid', - 'is_visible_dd_object', - 'isnull', - 'json_array', - 'json_array_append', - 'json_array_insert', - 'json_arrayagg', - 'json_contains', - 'json_contains_path', - 'json_depth', - 'json_extract', - 'json_insert', - 'json_keys', - 'json_length', - 'json_merge', - 'json_merge_patch', - 'json_merge_preserve', - 'json_object', - 'json_objectagg', - 'json_overlaps', - 'json_pretty', - 'json_quote', - 'json_remove', - 'json_replace', - 'json_schema_valid', - 'json_schema_validation_report', - 'json_search', - 'json_set', - 'json_storage_free', - 'json_storage_size', - 'json_type', - 'json_unquote', - 'json_valid', - 'last_day', - 'last_insert_id', - 'lcase', - 'least', - 'length', - 'like_range_max', - 'like_range_min', - 'ln', - 'load_file', - 'locate', - 'log', - 'log10', - 'log2', - 'lower', - 'lpad', - 'ltrim', - 'make_set', - 'makedate', - 'maketime', - 'master_pos_wait', - 'max', - 'mbrcontains', - 'mbrcoveredby', - 'mbrcovers', - 'mbrdisjoint', - 'mbrequals', - 'mbrintersects', - 'mbroverlaps', - 'mbrtouches', - 'mbrwithin', - 'md5', - 'mid', - 'min', - 'monthname', - 'name_const', - 'now', - 'nullif', - 'oct', - 'octet_length', - 'ord', - 'period_add', - 'period_diff', - 'pi', - 'position', - 'pow', - 'power', - 'ps_current_thread_id', - 'ps_thread_id', - 'quote', - 'radians', - 'rand', - 'random_bytes', - 'regexp_instr', - 'regexp_like', - 'regexp_replace', - 'regexp_substr', - 'release_all_locks', - 'release_lock', - 'remove_dd_property_key', - 'reverse', - 'roles_graphml', - 'round', - 'rpad', - 'rtrim', - 'sec_to_time', - 'session_user', - 'sha', - 'sha1', - 'sha2', - 'sign', - 'sin', - 'sleep', - 'soundex', - 'space', - 'sqrt', - 'st_area', - 'st_asbinary', - 'st_asgeojson', - 'st_astext', - 'st_aswkb', - 'st_aswkt', - 'st_buffer', - 'st_buffer_strategy', - 'st_centroid', - 'st_contains', - 'st_convexhull', - 'st_crosses', - 'st_difference', - 'st_dimension', - 'st_disjoint', - 'st_distance', - 'st_distance_sphere', - 'st_endpoint', - 'st_envelope', - 'st_equals', - 'st_exteriorring', - 'st_geohash', - 'st_geomcollfromtext', - 'st_geomcollfromtxt', - 'st_geomcollfromwkb', - 'st_geometrycollectionfromtext', - 'st_geometrycollectionfromwkb', - 'st_geometryfromtext', - 'st_geometryfromwkb', - 'st_geometryn', - 'st_geometrytype', - 'st_geomfromgeojson', - 'st_geomfromtext', - 'st_geomfromwkb', - 'st_interiorringn', - 'st_intersection', - 'st_intersects', - 'st_isclosed', - 'st_isempty', - 'st_issimple', - 'st_isvalid', - 'st_latfromgeohash', - 'st_latitude', - 'st_length', - 'st_linefromtext', - 'st_linefromwkb', - 'st_linestringfromtext', - 'st_linestringfromwkb', - 'st_longfromgeohash', - 'st_longitude', - 'st_makeenvelope', - 'st_mlinefromtext', - 'st_mlinefromwkb', - 'st_mpointfromtext', - 'st_mpointfromwkb', - 'st_mpolyfromtext', - 'st_mpolyfromwkb', - 'st_multilinestringfromtext', - 'st_multilinestringfromwkb', - 'st_multipointfromtext', - 'st_multipointfromwkb', - 'st_multipolygonfromtext', - 'st_multipolygonfromwkb', - 'st_numgeometries', - 'st_numinteriorring', - 'st_numinteriorrings', - 'st_numpoints', - 'st_overlaps', - 'st_pointfromgeohash', - 'st_pointfromtext', - 'st_pointfromwkb', - 'st_pointn', - 'st_polyfromtext', - 'st_polyfromwkb', - 'st_polygonfromtext', - 'st_polygonfromwkb', - 'st_simplify', - 'st_srid', - 'st_startpoint', - 'st_swapxy', - 'st_symdifference', - 'st_touches', - 'st_transform', - 'st_union', - 'st_validate', - 'st_within', - 'st_x', - 'st_y', - 'statement_digest', - 'statement_digest_text', - 'std', - 'stddev', - 'stddev_pop', - 'stddev_samp', - 'str_to_date', - 'strcmp', - 'subdate', - 'substr', - 'substring', - 'substring_index', - 'subtime', - 'sum', - 'sysdate', - 'system_user', - 'tan', - 'time_format', - 'time_to_sec', - 'timediff', - 'to_base64', - 'to_days', - 'to_seconds', - 'trim', - 'ucase', - 'uncompress', - 'uncompressed_length', - 'unhex', - 'unix_timestamp', - 'updatexml', - 'upper', - 'uuid', - 'uuid_short', - 'uuid_to_bin', - 'validate_password_strength', - 'var_pop', - 'var_samp', - 'variance', - 'version', - 'wait_for_executed_gtid_set', - 'wait_until_sql_thread_after_gtids', - 'weekday', - 'weekofyear', - 'yearweek', -) - - -MYSQL_OPTIMIZER_HINTS = ( - 'bka', - 'bnl', - 'dupsweedout', - 'firstmatch', - 'group_index', - 'hash_join', - 'index', - 'index_merge', - 'intoexists', - 'join_fixed_order', - 'join_index', - 'join_order', - 'join_prefix', - 'join_suffix', - 'loosescan', - 'materialization', - 'max_execution_time', - 'merge', - 'mrr', - 'no_bka', - 'no_bnl', - 'no_group_index', - 'no_hash_join', - 'no_icp', - 'no_index', - 'no_index_merge', - 'no_join_index', - 'no_merge', - 'no_mrr', - 'no_order_index', - 'no_range_optimization', - 'no_semijoin', - 'no_skip_scan', - 'order_index', - 'qb_name', - 'resource_group', - 'semijoin', - 'set_var', - 'skip_scan', - 'subquery', -) - - -MYSQL_KEYWORDS = ( - 'accessible', - 'account', - 'action', - 'active', - 'add', - 'admin', - 'after', - 'against', - 'aggregate', - 'algorithm', - 'all', - 'alter', - 'always', - 'analyze', - 'and', - 'any', - 'array', - 'as', - 'asc', - 'ascii', - 'asensitive', - 'at', - 'attribute', - 'auto_increment', - 'autoextend_size', - 'avg', - 'avg_row_length', - 'backup', - 'before', - 'begin', - 'between', - 'binlog', - 'block', - 'both', - 'btree', - 'buckets', - 'by', - 'byte', - 'cache', - 'call', - 'cascade', - 'cascaded', - 'case', - 'catalog_name', - 'chain', - 'change', - 'changed', - 'channel', - 'character', - 'charset', - 'check', - 'checksum', - 'cipher', - 'class_origin', - 'client', - 'clone', - 'close', - 'coalesce', - 'code', - 'collate', - 'collation', - 'column', - 'column_format', - 'column_name', - 'columns', - 'comment', - 'commit', - 'committed', - 'compact', - 'completion', - 'component', - 'compressed', - 'compression', - 'concurrent', - 'condition', - 'connection', - 'consistent', - 'constraint', - 'constraint_catalog', - 'constraint_name', - 'constraint_schema', - 'contains', - 'context', - 'continue', - 'convert', - 'cpu', - 'create', - 'cross', - 'cube', - 'cume_dist', - 'current', - 'current_date', - 'current_time', - 'current_timestamp', - 'current_user', - 'cursor', - 'cursor_name', - 'data', - 'database', - 'databases', - 'datafile', - 'day', - 'day_hour', - 'day_microsecond', - 'day_minute', - 'day_second', - 'deallocate', - 'declare', - 'default', - 'default_auth', - 'definer', - 'definition', - 'delay_key_write', - 'delayed', - 'delete', - 'dense_rank', - 'desc', - 'describe', - 'description', - 'deterministic', - 'diagnostics', - 'directory', - 'disable', - 'discard', - 'disk', - 'distinct', - 'distinctrow', - 'div', - 'do', - 'drop', - 'dual', - 'dumpfile', - 'duplicate', - 'dynamic', - 'each', - 'else', - 'elseif', - 'empty', - 'enable', - 'enclosed', - 'encryption', - 'end', - 'ends', - 'enforced', - 'engine', - 'engine_attribute', - 'engines', - 'error', - 'errors', - 'escape', - 'escaped', - 'event', - 'events', - 'every', - 'except', - 'exchange', - 'exclude', - 'execute', - 'exists', - 'exit', - 'expansion', - 'expire', - 'explain', - 'export', - 'extended', - 'extent_size', - 'failed_login_attempts', - 'false', - 'fast', - 'faults', - 'fetch', - 'fields', - 'file', - 'file_block_size', - 'filter', - 'first', - 'first_value', - 'flush', - 'following', - 'follows', - 'for', - 'force', - 'foreign', - 'format', - 'found', - 'from', - 'full', - 'fulltext', - 'function', - 'general', - 'generated', - 'geomcollection', - 'get', - 'get_format', - 'get_master_public_key', - 'global', - 'grant', - 'grants', - 'group', - 'group_replication', - 'grouping', - 'groups', - 'handler', - 'hash', - 'having', - 'help', - 'high_priority', - 'histogram', - 'history', - 'host', - 'hosts', - 'hour', - 'hour_microsecond', - 'hour_minute', - 'hour_second', - 'identified', - 'if', - 'ignore', - 'ignore_server_ids', - 'import', - 'in', - 'inactive', - 'index', - 'indexes', - 'infile', - 'initial_size', - 'inner', - 'inout', - 'insensitive', - 'insert', - 'insert_method', - 'install', - 'instance', - 'interval', - 'into', - 'invisible', - 'invoker', - 'io', - 'io_after_gtids', - 'io_before_gtids', - 'io_thread', - 'ipc', - 'is', - 'isolation', - 'issuer', - 'iterate', - 'join', - 'json_table', - 'json_value', - 'key', - 'key_block_size', - 'keys', - 'kill', - 'lag', - 'language', - 'last', - 'last_value', - 'lateral', - 'lead', - 'leading', - 'leave', - 'leaves', - 'left', - 'less', - 'level', - 'like', - 'limit', - 'linear', - 'lines', - 'list', - 'load', - 'local', - 'localtime', - 'localtimestamp', - 'lock', - 'locked', - 'locks', - 'logfile', - 'logs', - 'loop', - 'low_priority', - 'master', - 'master_auto_position', - 'master_bind', - 'master_compression_algorithms', - 'master_connect_retry', - 'master_delay', - 'master_heartbeat_period', - 'master_host', - 'master_log_file', - 'master_log_pos', - 'master_password', - 'master_port', - 'master_public_key_path', - 'master_retry_count', - 'master_server_id', - 'master_ssl', - 'master_ssl_ca', - 'master_ssl_capath', - 'master_ssl_cert', - 'master_ssl_cipher', - 'master_ssl_crl', - 'master_ssl_crlpath', - 'master_ssl_key', - 'master_ssl_verify_server_cert', - 'master_tls_ciphersuites', - 'master_tls_version', - 'master_user', - 'master_zstd_compression_level', - 'match', - 'max_connections_per_hour', - 'max_queries_per_hour', - 'max_rows', - 'max_size', - 'max_updates_per_hour', - 'max_user_connections', - 'maxvalue', - 'medium', - 'member', - 'memory', - 'merge', - 'message_text', - 'microsecond', - 'migrate', - 'min_rows', - 'minute', - 'minute_microsecond', - 'minute_second', - 'mod', - 'mode', - 'modifies', - 'modify', - 'month', - 'mutex', - 'mysql_errno', - 'name', - 'names', - 'natural', - 'ndb', - 'ndbcluster', - 'nested', - 'network_namespace', - 'never', - 'new', - 'next', - 'no', - 'no_wait', - 'no_write_to_binlog', - 'nodegroup', - 'none', - 'not', - 'nowait', - 'nth_value', - 'ntile', - 'null', - 'nulls', - 'number', - 'of', - 'off', - 'offset', - 'oj', - 'old', - 'on', - 'one', - 'only', - 'open', - 'optimize', - 'optimizer_costs', - 'option', - 'optional', - 'optionally', - 'options', - 'or', - 'order', - 'ordinality', - 'organization', - 'others', - 'out', - 'outer', - 'outfile', - 'over', - 'owner', - 'pack_keys', - 'page', - 'parser', - 'partial', - 'partition', - 'partitioning', - 'partitions', - 'password', - 'password_lock_time', - 'path', - 'percent_rank', - 'persist', - 'persist_only', - 'phase', - 'plugin', - 'plugin_dir', - 'plugins', - 'port', - 'precedes', - 'preceding', - 'prepare', - 'preserve', - 'prev', - 'primary', - 'privilege_checks_user', - 'privileges', - 'procedure', - 'process', - 'processlist', - 'profile', - 'profiles', - 'proxy', - 'purge', - 'quarter', - 'query', - 'quick', - 'random', - 'range', - 'rank', - 'read', - 'read_only', - 'read_write', - 'reads', - 'rebuild', - 'recover', - 'recursive', - 'redo_buffer_size', - 'redundant', - 'reference', - 'references', - 'regexp', - 'relay', - 'relay_log_file', - 'relay_log_pos', - 'relay_thread', - 'relaylog', - 'release', - 'reload', - 'remove', - 'rename', - 'reorganize', - 'repair', - 'repeat', - 'repeatable', - 'replace', - 'replicate_do_db', - 'replicate_do_table', - 'replicate_ignore_db', - 'replicate_ignore_table', - 'replicate_rewrite_db', - 'replicate_wild_do_table', - 'replicate_wild_ignore_table', - 'replication', - 'require', - 'require_row_format', - 'require_table_primary_key_check', - 'reset', - 'resignal', - 'resource', - 'respect', - 'restart', - 'restore', - 'restrict', - 'resume', - 'retain', - 'return', - 'returned_sqlstate', - 'returning', - 'returns', - 'reuse', - 'reverse', - 'revoke', - 'right', - 'rlike', - 'role', - 'rollback', - 'rollup', - 'rotate', - 'routine', - 'row', - 'row_count', - 'row_format', - 'row_number', - 'rows', - 'rtree', - 'savepoint', - 'schedule', - 'schema', - 'schema_name', - 'schemas', - 'second', - 'second_microsecond', - 'secondary', - 'secondary_engine', - 'secondary_engine_attribute', - 'secondary_load', - 'secondary_unload', - 'security', - 'select', - 'sensitive', - 'separator', - 'serializable', - 'server', - 'session', - 'share', - 'show', - 'shutdown', - 'signal', - 'signed', - 'simple', - 'skip', - 'slave', - 'slow', - 'snapshot', - 'socket', - 'some', - 'soname', - 'sounds', - 'source', - 'spatial', - 'specific', - 'sql', - 'sql_after_gtids', - 'sql_after_mts_gaps', - 'sql_before_gtids', - 'sql_big_result', - 'sql_buffer_result', - 'sql_calc_found_rows', - 'sql_no_cache', - 'sql_small_result', - 'sql_thread', - 'sql_tsi_day', - 'sql_tsi_hour', - 'sql_tsi_minute', - 'sql_tsi_month', - 'sql_tsi_quarter', - 'sql_tsi_second', - 'sql_tsi_week', - 'sql_tsi_year', - 'sqlexception', - 'sqlstate', - 'sqlwarning', - 'srid', - 'ssl', - 'stacked', - 'start', - 'starting', - 'starts', - 'stats_auto_recalc', - 'stats_persistent', - 'stats_sample_pages', - 'status', - 'stop', - 'storage', - 'stored', - 'straight_join', - 'stream', - 'string', - 'subclass_origin', - 'subject', - 'subpartition', - 'subpartitions', - 'super', - 'suspend', - 'swaps', - 'switches', - 'system', - 'table', - 'table_checksum', - 'table_name', - 'tables', - 'tablespace', - 'temporary', - 'temptable', - 'terminated', - 'than', - 'then', - 'thread_priority', - 'ties', - 'timestampadd', - 'timestampdiff', - 'tls', - 'to', - 'trailing', - 'transaction', - 'trigger', - 'triggers', - 'true', - 'truncate', - 'type', - 'types', - 'unbounded', - 'uncommitted', - 'undefined', - 'undo', - 'undo_buffer_size', - 'undofile', - 'unicode', - 'uninstall', - 'union', - 'unique', - 'unknown', - 'unlock', - 'unsigned', - 'until', - 'update', - 'upgrade', - 'usage', - 'use', - 'use_frm', - 'user', - 'user_resources', - 'using', - 'utc_date', - 'utc_time', - 'utc_timestamp', - 'validation', - 'value', - 'values', - 'variables', - 'vcpu', - 'view', - 'virtual', - 'visible', - 'wait', - 'warnings', - 'week', - 'weight_string', - 'when', - 'where', - 'while', - 'window', - 'with', - 'without', - 'work', - 'wrapper', - 'write', - 'x509', - 'xa', - 'xid', - 'xml', - 'xor', - 'year_month', - 'zerofill', -) - - -if __name__ == '__main__': # pragma: no cover - import re - from urllib.request import urlopen - - from pygments.util import format_lines - - # MySQL source code - SOURCE_URL = 'https://github.com/mysql/mysql-server/raw/8.0' - LEX_URL = SOURCE_URL + '/sql/lex.h' - ITEM_CREATE_URL = SOURCE_URL + '/sql/item_create.cc' - - - def update_myself(): - # Pull content from lex.h. - lex_file = urlopen(LEX_URL).read().decode('utf8', errors='ignore') - keywords = parse_lex_keywords(lex_file) - functions = parse_lex_functions(lex_file) - optimizer_hints = parse_lex_optimizer_hints(lex_file) - - # Parse content in item_create.cc. - item_create_file = urlopen(ITEM_CREATE_URL).read().decode('utf8', errors='ignore') - functions.update(parse_item_create_functions(item_create_file)) - - # Remove data types from the set of keywords. - keywords -= set(MYSQL_DATATYPES) - - update_content('MYSQL_FUNCTIONS', tuple(sorted(functions))) - update_content('MYSQL_KEYWORDS', tuple(sorted(keywords))) - update_content('MYSQL_OPTIMIZER_HINTS', tuple(sorted(optimizer_hints))) - - - def parse_lex_keywords(f): - """Parse keywords in lex.h.""" - - results = set() - for m in re.finditer(r'{SYM(?:_HK)?\("(?P<keyword>[a-z0-9_]+)",', f, flags=re.I): - results.add(m.group('keyword').lower()) - - if not results: - raise ValueError('No keywords found') - - return results - - - def parse_lex_optimizer_hints(f): - """Parse optimizer hints in lex.h.""" - - results = set() - for m in re.finditer(r'{SYM_H\("(?P<keyword>[a-z0-9_]+)",', f, flags=re.I): - results.add(m.group('keyword').lower()) - - if not results: - raise ValueError('No optimizer hints found') - - return results - - - def parse_lex_functions(f): - """Parse MySQL function names from lex.h.""" - - results = set() - for m in re.finditer(r'{SYM_FN?\("(?P<function>[a-z0-9_]+)",', f, flags=re.I): - results.add(m.group('function').lower()) - - if not results: - raise ValueError('No lex functions found') - - return results - - - def parse_item_create_functions(f): - """Parse MySQL function names from item_create.cc.""" - - results = set() - for m in re.finditer(r'{"(?P<function>[^"]+?)",\s*SQL_F[^(]+?\(', f, flags=re.I): - results.add(m.group('function').lower()) - - if not results: - raise ValueError('No item_create functions found') - - return results - - - def update_content(field_name, content): - """Overwrite this file with content parsed from MySQL's source code.""" - - with open(__file__) as f: - data = f.read() - - # Line to start/end inserting - re_match = re.compile(r'^%s\s*=\s*\($.*?^\s*\)$' % field_name, re.M | re.S) - m = re_match.search(data) - if not m: - raise ValueError('Could not find an existing definition for %s' % field_name) - - new_block = format_lines(field_name, content) - data = data[:m.start()] + new_block + data[m.end():] - - with open(__file__, 'w', newline='\n') as f: - f.write(data) - - update_myself() +# -*- coding: utf-8 -*- +""" + pygments.lexers._mysql_builtins + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Self-updating data files for the MySQL lexer. + + :copyright: Copyright 2020 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + + +MYSQL_CONSTANTS = ( + 'false', + 'null', + 'true', + 'unknown', +) + + +# At this time, no easily-parsed, definitive list of data types +# has been found in the MySQL source code or documentation. (The +# `sql/sql_yacc.yy` file is definitive but is difficult to parse.) +# Therefore these types are currently maintained manually. +# +# Some words in this list -- like "long", "national", "precision", +# and "varying" -- appear to only occur in combination with other +# data type keywords. Therefore they are included as separate words +# even though they do not naturally occur in syntax separately. +# +# This list is also used to strip data types out of the list of +# MySQL keywords, which is automatically updated later in the file. +# +MYSQL_DATATYPES = ( + # Numeric data types + 'bigint', + 'bit', + 'bool', + 'boolean', + 'dec', + 'decimal', + 'double', + 'fixed', + 'float', + 'float4', + 'float8', + 'int', + 'int1', + 'int2', + 'int3', + 'int4', + 'int8', + 'integer', + 'mediumint', + 'middleint', + 'numeric', + 'precision', + 'real', + 'serial', + 'smallint', + 'tinyint', + + # Date and time data types + 'date', + 'datetime', + 'time', + 'timestamp', + 'year', + + # String data types + 'binary', + 'blob', + 'char', + 'enum', + 'long', + 'longblob', + 'longtext', + 'mediumblob', + 'mediumtext', + 'national', + 'nchar', + 'nvarchar', + 'set', + 'text', + 'tinyblob', + 'tinytext', + 'varbinary', + 'varchar', + 'varcharacter', + 'varying', + + # Spatial data types + 'geometry', + 'geometrycollection', + 'linestring', + 'multilinestring', + 'multipoint', + 'multipolygon', + 'point', + 'polygon', + + # JSON data types + 'json', +) + +# Everything below this line is auto-generated from the MySQL source code. +# Run this file in Python and it will update itself. +# ----------------------------------------------------------------------------- + +MYSQL_FUNCTIONS = ( + 'abs', + 'acos', + 'adddate', + 'addtime', + 'aes_decrypt', + 'aes_encrypt', + 'any_value', + 'asin', + 'atan', + 'atan2', + 'benchmark', + 'bin', + 'bin_to_uuid', + 'bit_and', + 'bit_count', + 'bit_length', + 'bit_or', + 'bit_xor', + 'can_access_column', + 'can_access_database', + 'can_access_event', + 'can_access_resource_group', + 'can_access_routine', + 'can_access_table', + 'can_access_trigger', + 'can_access_view', + 'cast', + 'ceil', + 'ceiling', + 'char_length', + 'character_length', + 'coercibility', + 'compress', + 'concat', + 'concat_ws', + 'connection_id', + 'conv', + 'convert_cpu_id_mask', + 'convert_interval_to_user_interval', + 'convert_tz', + 'cos', + 'cot', + 'count', + 'crc32', + 'curdate', + 'current_role', + 'curtime', + 'date_add', + 'date_format', + 'date_sub', + 'datediff', + 'dayname', + 'dayofmonth', + 'dayofweek', + 'dayofyear', + 'degrees', + 'elt', + 'exp', + 'export_set', + 'extract', + 'extractvalue', + 'field', + 'find_in_set', + 'floor', + 'format_bytes', + 'format_pico_time', + 'found_rows', + 'from_base64', + 'from_days', + 'from_unixtime', + 'get_dd_column_privileges', + 'get_dd_create_options', + 'get_dd_index_private_data', + 'get_dd_index_sub_part_length', + 'get_dd_property_key_value', + 'get_dd_tablespace_private_data', + 'get_lock', + 'greatest', + 'group_concat', + 'gtid_subset', + 'gtid_subtract', + 'hex', + 'icu_version', + 'ifnull', + 'inet6_aton', + 'inet6_ntoa', + 'inet_aton', + 'inet_ntoa', + 'instr', + 'internal_auto_increment', + 'internal_avg_row_length', + 'internal_check_time', + 'internal_checksum', + 'internal_data_free', + 'internal_data_length', + 'internal_dd_char_length', + 'internal_get_comment_or_error', + 'internal_get_dd_column_extra', + 'internal_get_enabled_role_json', + 'internal_get_hostname', + 'internal_get_mandatory_roles_json', + 'internal_get_partition_nodegroup', + 'internal_get_username', + 'internal_get_view_warning_or_error', + 'internal_index_column_cardinality', + 'internal_index_length', + 'internal_is_enabled_role', + 'internal_is_mandatory_role', + 'internal_keys_disabled', + 'internal_max_data_length', + 'internal_table_rows', + 'internal_tablespace_autoextend_size', + 'internal_tablespace_data_free', + 'internal_tablespace_extent_size', + 'internal_tablespace_extra', + 'internal_tablespace_free_extents', + 'internal_tablespace_id', + 'internal_tablespace_initial_size', + 'internal_tablespace_logfile_group_name', + 'internal_tablespace_logfile_group_number', + 'internal_tablespace_maximum_size', + 'internal_tablespace_row_format', + 'internal_tablespace_status', + 'internal_tablespace_total_extents', + 'internal_tablespace_type', + 'internal_tablespace_version', + 'internal_update_time', + 'is_free_lock', + 'is_ipv4', + 'is_ipv4_compat', + 'is_ipv4_mapped', + 'is_ipv6', + 'is_used_lock', + 'is_uuid', + 'is_visible_dd_object', + 'isnull', + 'json_array', + 'json_array_append', + 'json_array_insert', + 'json_arrayagg', + 'json_contains', + 'json_contains_path', + 'json_depth', + 'json_extract', + 'json_insert', + 'json_keys', + 'json_length', + 'json_merge', + 'json_merge_patch', + 'json_merge_preserve', + 'json_object', + 'json_objectagg', + 'json_overlaps', + 'json_pretty', + 'json_quote', + 'json_remove', + 'json_replace', + 'json_schema_valid', + 'json_schema_validation_report', + 'json_search', + 'json_set', + 'json_storage_free', + 'json_storage_size', + 'json_type', + 'json_unquote', + 'json_valid', + 'last_day', + 'last_insert_id', + 'lcase', + 'least', + 'length', + 'like_range_max', + 'like_range_min', + 'ln', + 'load_file', + 'locate', + 'log', + 'log10', + 'log2', + 'lower', + 'lpad', + 'ltrim', + 'make_set', + 'makedate', + 'maketime', + 'master_pos_wait', + 'max', + 'mbrcontains', + 'mbrcoveredby', + 'mbrcovers', + 'mbrdisjoint', + 'mbrequals', + 'mbrintersects', + 'mbroverlaps', + 'mbrtouches', + 'mbrwithin', + 'md5', + 'mid', + 'min', + 'monthname', + 'name_const', + 'now', + 'nullif', + 'oct', + 'octet_length', + 'ord', + 'period_add', + 'period_diff', + 'pi', + 'position', + 'pow', + 'power', + 'ps_current_thread_id', + 'ps_thread_id', + 'quote', + 'radians', + 'rand', + 'random_bytes', + 'regexp_instr', + 'regexp_like', + 'regexp_replace', + 'regexp_substr', + 'release_all_locks', + 'release_lock', + 'remove_dd_property_key', + 'reverse', + 'roles_graphml', + 'round', + 'rpad', + 'rtrim', + 'sec_to_time', + 'session_user', + 'sha', + 'sha1', + 'sha2', + 'sign', + 'sin', + 'sleep', + 'soundex', + 'space', + 'sqrt', + 'st_area', + 'st_asbinary', + 'st_asgeojson', + 'st_astext', + 'st_aswkb', + 'st_aswkt', + 'st_buffer', + 'st_buffer_strategy', + 'st_centroid', + 'st_contains', + 'st_convexhull', + 'st_crosses', + 'st_difference', + 'st_dimension', + 'st_disjoint', + 'st_distance', + 'st_distance_sphere', + 'st_endpoint', + 'st_envelope', + 'st_equals', + 'st_exteriorring', + 'st_geohash', + 'st_geomcollfromtext', + 'st_geomcollfromtxt', + 'st_geomcollfromwkb', + 'st_geometrycollectionfromtext', + 'st_geometrycollectionfromwkb', + 'st_geometryfromtext', + 'st_geometryfromwkb', + 'st_geometryn', + 'st_geometrytype', + 'st_geomfromgeojson', + 'st_geomfromtext', + 'st_geomfromwkb', + 'st_interiorringn', + 'st_intersection', + 'st_intersects', + 'st_isclosed', + 'st_isempty', + 'st_issimple', + 'st_isvalid', + 'st_latfromgeohash', + 'st_latitude', + 'st_length', + 'st_linefromtext', + 'st_linefromwkb', + 'st_linestringfromtext', + 'st_linestringfromwkb', + 'st_longfromgeohash', + 'st_longitude', + 'st_makeenvelope', + 'st_mlinefromtext', + 'st_mlinefromwkb', + 'st_mpointfromtext', + 'st_mpointfromwkb', + 'st_mpolyfromtext', + 'st_mpolyfromwkb', + 'st_multilinestringfromtext', + 'st_multilinestringfromwkb', + 'st_multipointfromtext', + 'st_multipointfromwkb', + 'st_multipolygonfromtext', + 'st_multipolygonfromwkb', + 'st_numgeometries', + 'st_numinteriorring', + 'st_numinteriorrings', + 'st_numpoints', + 'st_overlaps', + 'st_pointfromgeohash', + 'st_pointfromtext', + 'st_pointfromwkb', + 'st_pointn', + 'st_polyfromtext', + 'st_polyfromwkb', + 'st_polygonfromtext', + 'st_polygonfromwkb', + 'st_simplify', + 'st_srid', + 'st_startpoint', + 'st_swapxy', + 'st_symdifference', + 'st_touches', + 'st_transform', + 'st_union', + 'st_validate', + 'st_within', + 'st_x', + 'st_y', + 'statement_digest', + 'statement_digest_text', + 'std', + 'stddev', + 'stddev_pop', + 'stddev_samp', + 'str_to_date', + 'strcmp', + 'subdate', + 'substr', + 'substring', + 'substring_index', + 'subtime', + 'sum', + 'sysdate', + 'system_user', + 'tan', + 'time_format', + 'time_to_sec', + 'timediff', + 'to_base64', + 'to_days', + 'to_seconds', + 'trim', + 'ucase', + 'uncompress', + 'uncompressed_length', + 'unhex', + 'unix_timestamp', + 'updatexml', + 'upper', + 'uuid', + 'uuid_short', + 'uuid_to_bin', + 'validate_password_strength', + 'var_pop', + 'var_samp', + 'variance', + 'version', + 'wait_for_executed_gtid_set', + 'wait_until_sql_thread_after_gtids', + 'weekday', + 'weekofyear', + 'yearweek', +) + + +MYSQL_OPTIMIZER_HINTS = ( + 'bka', + 'bnl', + 'dupsweedout', + 'firstmatch', + 'group_index', + 'hash_join', + 'index', + 'index_merge', + 'intoexists', + 'join_fixed_order', + 'join_index', + 'join_order', + 'join_prefix', + 'join_suffix', + 'loosescan', + 'materialization', + 'max_execution_time', + 'merge', + 'mrr', + 'no_bka', + 'no_bnl', + 'no_group_index', + 'no_hash_join', + 'no_icp', + 'no_index', + 'no_index_merge', + 'no_join_index', + 'no_merge', + 'no_mrr', + 'no_order_index', + 'no_range_optimization', + 'no_semijoin', + 'no_skip_scan', + 'order_index', + 'qb_name', + 'resource_group', + 'semijoin', + 'set_var', + 'skip_scan', + 'subquery', +) + + +MYSQL_KEYWORDS = ( + 'accessible', + 'account', + 'action', + 'active', + 'add', + 'admin', + 'after', + 'against', + 'aggregate', + 'algorithm', + 'all', + 'alter', + 'always', + 'analyze', + 'and', + 'any', + 'array', + 'as', + 'asc', + 'ascii', + 'asensitive', + 'at', + 'attribute', + 'auto_increment', + 'autoextend_size', + 'avg', + 'avg_row_length', + 'backup', + 'before', + 'begin', + 'between', + 'binlog', + 'block', + 'both', + 'btree', + 'buckets', + 'by', + 'byte', + 'cache', + 'call', + 'cascade', + 'cascaded', + 'case', + 'catalog_name', + 'chain', + 'change', + 'changed', + 'channel', + 'character', + 'charset', + 'check', + 'checksum', + 'cipher', + 'class_origin', + 'client', + 'clone', + 'close', + 'coalesce', + 'code', + 'collate', + 'collation', + 'column', + 'column_format', + 'column_name', + 'columns', + 'comment', + 'commit', + 'committed', + 'compact', + 'completion', + 'component', + 'compressed', + 'compression', + 'concurrent', + 'condition', + 'connection', + 'consistent', + 'constraint', + 'constraint_catalog', + 'constraint_name', + 'constraint_schema', + 'contains', + 'context', + 'continue', + 'convert', + 'cpu', + 'create', + 'cross', + 'cube', + 'cume_dist', + 'current', + 'current_date', + 'current_time', + 'current_timestamp', + 'current_user', + 'cursor', + 'cursor_name', + 'data', + 'database', + 'databases', + 'datafile', + 'day', + 'day_hour', + 'day_microsecond', + 'day_minute', + 'day_second', + 'deallocate', + 'declare', + 'default', + 'default_auth', + 'definer', + 'definition', + 'delay_key_write', + 'delayed', + 'delete', + 'dense_rank', + 'desc', + 'describe', + 'description', + 'deterministic', + 'diagnostics', + 'directory', + 'disable', + 'discard', + 'disk', + 'distinct', + 'distinctrow', + 'div', + 'do', + 'drop', + 'dual', + 'dumpfile', + 'duplicate', + 'dynamic', + 'each', + 'else', + 'elseif', + 'empty', + 'enable', + 'enclosed', + 'encryption', + 'end', + 'ends', + 'enforced', + 'engine', + 'engine_attribute', + 'engines', + 'error', + 'errors', + 'escape', + 'escaped', + 'event', + 'events', + 'every', + 'except', + 'exchange', + 'exclude', + 'execute', + 'exists', + 'exit', + 'expansion', + 'expire', + 'explain', + 'export', + 'extended', + 'extent_size', + 'failed_login_attempts', + 'false', + 'fast', + 'faults', + 'fetch', + 'fields', + 'file', + 'file_block_size', + 'filter', + 'first', + 'first_value', + 'flush', + 'following', + 'follows', + 'for', + 'force', + 'foreign', + 'format', + 'found', + 'from', + 'full', + 'fulltext', + 'function', + 'general', + 'generated', + 'geomcollection', + 'get', + 'get_format', + 'get_master_public_key', + 'global', + 'grant', + 'grants', + 'group', + 'group_replication', + 'grouping', + 'groups', + 'handler', + 'hash', + 'having', + 'help', + 'high_priority', + 'histogram', + 'history', + 'host', + 'hosts', + 'hour', + 'hour_microsecond', + 'hour_minute', + 'hour_second', + 'identified', + 'if', + 'ignore', + 'ignore_server_ids', + 'import', + 'in', + 'inactive', + 'index', + 'indexes', + 'infile', + 'initial_size', + 'inner', + 'inout', + 'insensitive', + 'insert', + 'insert_method', + 'install', + 'instance', + 'interval', + 'into', + 'invisible', + 'invoker', + 'io', + 'io_after_gtids', + 'io_before_gtids', + 'io_thread', + 'ipc', + 'is', + 'isolation', + 'issuer', + 'iterate', + 'join', + 'json_table', + 'json_value', + 'key', + 'key_block_size', + 'keys', + 'kill', + 'lag', + 'language', + 'last', + 'last_value', + 'lateral', + 'lead', + 'leading', + 'leave', + 'leaves', + 'left', + 'less', + 'level', + 'like', + 'limit', + 'linear', + 'lines', + 'list', + 'load', + 'local', + 'localtime', + 'localtimestamp', + 'lock', + 'locked', + 'locks', + 'logfile', + 'logs', + 'loop', + 'low_priority', + 'master', + 'master_auto_position', + 'master_bind', + 'master_compression_algorithms', + 'master_connect_retry', + 'master_delay', + 'master_heartbeat_period', + 'master_host', + 'master_log_file', + 'master_log_pos', + 'master_password', + 'master_port', + 'master_public_key_path', + 'master_retry_count', + 'master_server_id', + 'master_ssl', + 'master_ssl_ca', + 'master_ssl_capath', + 'master_ssl_cert', + 'master_ssl_cipher', + 'master_ssl_crl', + 'master_ssl_crlpath', + 'master_ssl_key', + 'master_ssl_verify_server_cert', + 'master_tls_ciphersuites', + 'master_tls_version', + 'master_user', + 'master_zstd_compression_level', + 'match', + 'max_connections_per_hour', + 'max_queries_per_hour', + 'max_rows', + 'max_size', + 'max_updates_per_hour', + 'max_user_connections', + 'maxvalue', + 'medium', + 'member', + 'memory', + 'merge', + 'message_text', + 'microsecond', + 'migrate', + 'min_rows', + 'minute', + 'minute_microsecond', + 'minute_second', + 'mod', + 'mode', + 'modifies', + 'modify', + 'month', + 'mutex', + 'mysql_errno', + 'name', + 'names', + 'natural', + 'ndb', + 'ndbcluster', + 'nested', + 'network_namespace', + 'never', + 'new', + 'next', + 'no', + 'no_wait', + 'no_write_to_binlog', + 'nodegroup', + 'none', + 'not', + 'nowait', + 'nth_value', + 'ntile', + 'null', + 'nulls', + 'number', + 'of', + 'off', + 'offset', + 'oj', + 'old', + 'on', + 'one', + 'only', + 'open', + 'optimize', + 'optimizer_costs', + 'option', + 'optional', + 'optionally', + 'options', + 'or', + 'order', + 'ordinality', + 'organization', + 'others', + 'out', + 'outer', + 'outfile', + 'over', + 'owner', + 'pack_keys', + 'page', + 'parser', + 'partial', + 'partition', + 'partitioning', + 'partitions', + 'password', + 'password_lock_time', + 'path', + 'percent_rank', + 'persist', + 'persist_only', + 'phase', + 'plugin', + 'plugin_dir', + 'plugins', + 'port', + 'precedes', + 'preceding', + 'prepare', + 'preserve', + 'prev', + 'primary', + 'privilege_checks_user', + 'privileges', + 'procedure', + 'process', + 'processlist', + 'profile', + 'profiles', + 'proxy', + 'purge', + 'quarter', + 'query', + 'quick', + 'random', + 'range', + 'rank', + 'read', + 'read_only', + 'read_write', + 'reads', + 'rebuild', + 'recover', + 'recursive', + 'redo_buffer_size', + 'redundant', + 'reference', + 'references', + 'regexp', + 'relay', + 'relay_log_file', + 'relay_log_pos', + 'relay_thread', + 'relaylog', + 'release', + 'reload', + 'remove', + 'rename', + 'reorganize', + 'repair', + 'repeat', + 'repeatable', + 'replace', + 'replicate_do_db', + 'replicate_do_table', + 'replicate_ignore_db', + 'replicate_ignore_table', + 'replicate_rewrite_db', + 'replicate_wild_do_table', + 'replicate_wild_ignore_table', + 'replication', + 'require', + 'require_row_format', + 'require_table_primary_key_check', + 'reset', + 'resignal', + 'resource', + 'respect', + 'restart', + 'restore', + 'restrict', + 'resume', + 'retain', + 'return', + 'returned_sqlstate', + 'returning', + 'returns', + 'reuse', + 'reverse', + 'revoke', + 'right', + 'rlike', + 'role', + 'rollback', + 'rollup', + 'rotate', + 'routine', + 'row', + 'row_count', + 'row_format', + 'row_number', + 'rows', + 'rtree', + 'savepoint', + 'schedule', + 'schema', + 'schema_name', + 'schemas', + 'second', + 'second_microsecond', + 'secondary', + 'secondary_engine', + 'secondary_engine_attribute', + 'secondary_load', + 'secondary_unload', + 'security', + 'select', + 'sensitive', + 'separator', + 'serializable', + 'server', + 'session', + 'share', + 'show', + 'shutdown', + 'signal', + 'signed', + 'simple', + 'skip', + 'slave', + 'slow', + 'snapshot', + 'socket', + 'some', + 'soname', + 'sounds', + 'source', + 'spatial', + 'specific', + 'sql', + 'sql_after_gtids', + 'sql_after_mts_gaps', + 'sql_before_gtids', + 'sql_big_result', + 'sql_buffer_result', + 'sql_calc_found_rows', + 'sql_no_cache', + 'sql_small_result', + 'sql_thread', + 'sql_tsi_day', + 'sql_tsi_hour', + 'sql_tsi_minute', + 'sql_tsi_month', + 'sql_tsi_quarter', + 'sql_tsi_second', + 'sql_tsi_week', + 'sql_tsi_year', + 'sqlexception', + 'sqlstate', + 'sqlwarning', + 'srid', + 'ssl', + 'stacked', + 'start', + 'starting', + 'starts', + 'stats_auto_recalc', + 'stats_persistent', + 'stats_sample_pages', + 'status', + 'stop', + 'storage', + 'stored', + 'straight_join', + 'stream', + 'string', + 'subclass_origin', + 'subject', + 'subpartition', + 'subpartitions', + 'super', + 'suspend', + 'swaps', + 'switches', + 'system', + 'table', + 'table_checksum', + 'table_name', + 'tables', + 'tablespace', + 'temporary', + 'temptable', + 'terminated', + 'than', + 'then', + 'thread_priority', + 'ties', + 'timestampadd', + 'timestampdiff', + 'tls', + 'to', + 'trailing', + 'transaction', + 'trigger', + 'triggers', + 'true', + 'truncate', + 'type', + 'types', + 'unbounded', + 'uncommitted', + 'undefined', + 'undo', + 'undo_buffer_size', + 'undofile', + 'unicode', + 'uninstall', + 'union', + 'unique', + 'unknown', + 'unlock', + 'unsigned', + 'until', + 'update', + 'upgrade', + 'usage', + 'use', + 'use_frm', + 'user', + 'user_resources', + 'using', + 'utc_date', + 'utc_time', + 'utc_timestamp', + 'validation', + 'value', + 'values', + 'variables', + 'vcpu', + 'view', + 'virtual', + 'visible', + 'wait', + 'warnings', + 'week', + 'weight_string', + 'when', + 'where', + 'while', + 'window', + 'with', + 'without', + 'work', + 'wrapper', + 'write', + 'x509', + 'xa', + 'xid', + 'xml', + 'xor', + 'year_month', + 'zerofill', +) + + +if __name__ == '__main__': # pragma: no cover + import re + from urllib.request import urlopen + + from pygments.util import format_lines + + # MySQL source code + SOURCE_URL = 'https://github.com/mysql/mysql-server/raw/8.0' + LEX_URL = SOURCE_URL + '/sql/lex.h' + ITEM_CREATE_URL = SOURCE_URL + '/sql/item_create.cc' + + + def update_myself(): + # Pull content from lex.h. + lex_file = urlopen(LEX_URL).read().decode('utf8', errors='ignore') + keywords = parse_lex_keywords(lex_file) + functions = parse_lex_functions(lex_file) + optimizer_hints = parse_lex_optimizer_hints(lex_file) + + # Parse content in item_create.cc. + item_create_file = urlopen(ITEM_CREATE_URL).read().decode('utf8', errors='ignore') + functions.update(parse_item_create_functions(item_create_file)) + + # Remove data types from the set of keywords. + keywords -= set(MYSQL_DATATYPES) + + update_content('MYSQL_FUNCTIONS', tuple(sorted(functions))) + update_content('MYSQL_KEYWORDS', tuple(sorted(keywords))) + update_content('MYSQL_OPTIMIZER_HINTS', tuple(sorted(optimizer_hints))) + + + def parse_lex_keywords(f): + """Parse keywords in lex.h.""" + + results = set() + for m in re.finditer(r'{SYM(?:_HK)?\("(?P<keyword>[a-z0-9_]+)",', f, flags=re.I): + results.add(m.group('keyword').lower()) + + if not results: + raise ValueError('No keywords found') + + return results + + + def parse_lex_optimizer_hints(f): + """Parse optimizer hints in lex.h.""" + + results = set() + for m in re.finditer(r'{SYM_H\("(?P<keyword>[a-z0-9_]+)",', f, flags=re.I): + results.add(m.group('keyword').lower()) + + if not results: + raise ValueError('No optimizer hints found') + + return results + + + def parse_lex_functions(f): + """Parse MySQL function names from lex.h.""" + + results = set() + for m in re.finditer(r'{SYM_FN?\("(?P<function>[a-z0-9_]+)",', f, flags=re.I): + results.add(m.group('function').lower()) + + if not results: + raise ValueError('No lex functions found') + + return results + + + def parse_item_create_functions(f): + """Parse MySQL function names from item_create.cc.""" + + results = set() + for m in re.finditer(r'{"(?P<function>[^"]+?)",\s*SQL_F[^(]+?\(', f, flags=re.I): + results.add(m.group('function').lower()) + + if not results: + raise ValueError('No item_create functions found') + + return results + + + def update_content(field_name, content): + """Overwrite this file with content parsed from MySQL's source code.""" + + with open(__file__) as f: + data = f.read() + + # Line to start/end inserting + re_match = re.compile(r'^%s\s*=\s*\($.*?^\s*\)$' % field_name, re.M | re.S) + m = re_match.search(data) + if not m: + raise ValueError('Could not find an existing definition for %s' % field_name) + + new_block = format_lines(field_name, content) + data = data[:m.start()] + new_block + data[m.end():] + + with open(__file__, 'w', newline='\n') as f: + f.write(data) + + update_myself()