eric6/ThirdParty/Pygments/pygments/lexers/sql.py

changeset 7547
21b0534faebc
parent 6942
2602857055c5
child 7701
25f42e208e08
equal deleted inserted replaced
7546:bf5f777260a6 7547:21b0534faebc
32 - handles psql backslash commands. 32 - handles psql backslash commands.
33 33
34 The ``tests/examplefiles`` contains a few test files with data to be 34 The ``tests/examplefiles`` contains a few test files with data to be
35 parsed by these lexers. 35 parsed by these lexers.
36 36
37 :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS. 37 :copyright: Copyright 2006-2019 by the Pygments team, see AUTHORS.
38 :license: BSD, see LICENSE for details. 38 :license: BSD, see LICENSE for details.
39 """ 39 """
40 40
41 import re 41 import re
42 42
43 from pygments.lexer import Lexer, RegexLexer, do_insertions, bygroups, words 43 from pygments.lexer import Lexer, RegexLexer, do_insertions, bygroups, words
44 from pygments.token import Punctuation, Whitespace, Error, \ 44 from pygments.token import Punctuation, Whitespace, Text, Comment, Operator, \
45 Text, Comment, Operator, Keyword, Name, String, Number, Generic 45 Keyword, Name, String, Number, Generic
46 from pygments.lexers import get_lexer_by_name, ClassNotFound 46 from pygments.lexers import get_lexer_by_name, ClassNotFound
47 from pygments.util import iteritems
48 47
49 from pygments.lexers._postgres_builtins import KEYWORDS, DATATYPES, \ 48 from pygments.lexers._postgres_builtins import KEYWORDS, DATATYPES, \
50 PSEUDO_TYPES, PLPGSQL_KEYWORDS 49 PSEUDO_TYPES, PLPGSQL_KEYWORDS
51 from pygments.lexers import _tsql_builtins 50 from pygments.lexers import _tsql_builtins
52 51
57 56
58 line_re = re.compile('.*?\n') 57 line_re = re.compile('.*?\n')
59 58
60 language_re = re.compile(r"\s+LANGUAGE\s+'?(\w+)'?", re.IGNORECASE) 59 language_re = re.compile(r"\s+LANGUAGE\s+'?(\w+)'?", re.IGNORECASE)
61 60
62 do_re = re.compile(r'\bDO\b', re.IGNORECASE) 61 do_re = re.compile(r'\bDO\b', re.IGNORECASE)
62
63 # Regular expressions for analyse_text()
64 name_between_bracket_re = re.compile(r'\[[a-zA-Z_]\w*\]')
65 name_between_backtick_re = re.compile(r'`[a-zA-Z_]\w*`')
66 tsql_go_re = re.compile(r'\bgo\b', re.IGNORECASE)
67 tsql_declare_re = re.compile(r'\bdeclare\s+@', re.IGNORECASE)
68 tsql_variable_re = re.compile(r'@[a-zA-Z_]\w*\b')
63 69
64 70
65 def language_callback(lexer, match): 71 def language_callback(lexer, match):
66 """Parse the content of a $-string using a lexer 72 """Parse the content of a $-string using a lexer
67 73
68 The lexer is chosen looking for a nearby LANGUAGE or assumed as 74 The lexer is chosen looking for a nearby LANGUAGE or assumed as
69 plpgsql if inside a DO statement and no LANGUAGE has been found. 75 plpgsql if inside a DO statement and no LANGUAGE has been found.
70 """ 76 """
71 l = None 77 lx = None
72 m = language_re.match(lexer.text[match.end():match.end()+100]) 78 m = language_re.match(lexer.text[match.end():match.end()+100])
73 if m is not None: 79 if m is not None:
74 l = lexer._get_lexer(m.group(1)) 80 lx = lexer._get_lexer(m.group(1))
75 else: 81 else:
76 m = list(language_re.finditer( 82 m = list(language_re.finditer(
77 lexer.text[max(0, match.start()-100):match.start()])) 83 lexer.text[max(0, match.start()-100):match.start()]))
78 if m: 84 if m:
79 l = lexer._get_lexer(m[-1].group(1)) 85 lx = lexer._get_lexer(m[-1].group(1))
80 else: 86 else:
81 m = list(do_re.finditer( 87 m = list(do_re.finditer(
82 lexer.text[max(0, match.start()-25):match.start()])) 88 lexer.text[max(0, match.start()-25):match.start()]))
83 if m: 89 if m:
84 l = lexer._get_lexer('plpgsql') 90 lx = lexer._get_lexer('plpgsql')
85 91
86 # 1 = $, 2 = delimiter, 3 = $ 92 # 1 = $, 2 = delimiter, 3 = $
87 yield (match.start(1), String, match.group(1)) 93 yield (match.start(1), String, match.group(1))
88 yield (match.start(2), String.Delimiter, match.group(2)) 94 yield (match.start(2), String.Delimiter, match.group(2))
89 yield (match.start(3), String, match.group(3)) 95 yield (match.start(3), String, match.group(3))
90 # 4 = string contents 96 # 4 = string contents
91 if l: 97 if lx:
92 for x in l.get_tokens_unprocessed(match.group(4)): 98 for x in lx.get_tokens_unprocessed(match.group(4)):
93 yield x 99 yield x
94 else: 100 else:
95 yield (match.start(4), String, match.group(4)) 101 yield (match.start(4), String, match.group(4))
96 # 5 = $, 6 = delimiter, 7 = $ 102 # 5 = $, 6 = delimiter, 7 = $
97 yield (match.start(5), String, match.group(5)) 103 yield (match.start(5), String, match.group(5))
98 yield (match.start(6), String.Delimiter, match.group(6)) 104 yield (match.start(6), String.Delimiter, match.group(6))
99 yield (match.start(7), String, match.group(7)) 105 yield (match.start(7), String, match.group(7))
100 106
101 107
102 class PostgresBase(object): 108 class PostgresBase:
103 """Base class for Postgres-related lexers. 109 """Base class for Postgres-related lexers.
104 110
105 This is implemented as a mixin to avoid the Lexer metaclass kicking in. 111 This is implemented as a mixin to avoid the Lexer metaclass kicking in.
106 this way the different lexer don't have a common Lexer ancestor. If they 112 this way the different lexer don't have a common Lexer ancestor. If they
107 had, _tokens could be created on this ancestor and not updated for the 113 had, _tokens could be created on this ancestor and not updated for the
125 if lang.endswith('u'): 131 if lang.endswith('u'):
126 tries.append(lang[:-1]) 132 tries.append(lang[:-1])
127 if lang.startswith('pl') and lang.endswith('u'): 133 if lang.startswith('pl') and lang.endswith('u'):
128 tries.append(lang[2:-1]) 134 tries.append(lang[2:-1])
129 135
130 for l in tries: 136 for lx in tries:
131 try: 137 try:
132 return get_lexer_by_name(l, **self.options) 138 return get_lexer_by_name(lx, **self.options)
133 except ClassNotFound: 139 except ClassNotFound:
134 pass 140 pass
135 else: 141 else:
136 # TODO: better logging 142 # TODO: better logging
137 # print >>sys.stderr, "language not found:", lang 143 # print >>sys.stderr, "language not found:", lang
154 'root': [ 160 'root': [
155 (r'\s+', Text), 161 (r'\s+', Text),
156 (r'--.*\n?', Comment.Single), 162 (r'--.*\n?', Comment.Single),
157 (r'/\*', Comment.Multiline, 'multiline-comments'), 163 (r'/\*', Comment.Multiline, 'multiline-comments'),
158 (r'(' + '|'.join(s.replace(" ", r"\s+") 164 (r'(' + '|'.join(s.replace(" ", r"\s+")
159 for s in DATATYPES + PSEUDO_TYPES) 165 for s in DATATYPES + PSEUDO_TYPES) + r')\b',
160 + r')\b', Name.Builtin), 166 Name.Builtin),
161 (words(KEYWORDS, suffix=r'\b'), Keyword), 167 (words(KEYWORDS, suffix=r'\b'), Keyword),
162 (r'[+*/<>=~!@#%^&|`?-]+', Operator), 168 (r'[+*/<>=~!@#%^&|`?-]+', Operator),
163 (r'::', Operator), # cast 169 (r'::', Operator), # cast
164 (r'\$\d+', Name.Variable), 170 (r'\$\d+', Name.Variable),
165 (r'([0-9]*\.[0-9]*|[0-9]+)(e[+-]?[0-9]+)?', Number.Float), 171 (r'([0-9]*\.[0-9]*|[0-9]+)(e[+-]?[0-9]+)?', Number.Float),
203 name = 'PL/pgSQL' 209 name = 'PL/pgSQL'
204 aliases = ['plpgsql'] 210 aliases = ['plpgsql']
205 mimetypes = ['text/x-plpgsql'] 211 mimetypes = ['text/x-plpgsql']
206 212
207 flags = re.IGNORECASE 213 flags = re.IGNORECASE
208 tokens = dict((k, l[:]) for (k, l) in iteritems(PostgresLexer.tokens)) 214 tokens = {k: l[:] for (k, l) in PostgresLexer.tokens.items()}
209 215
210 # extend the keywords list 216 # extend the keywords list
211 for i, pattern in enumerate(tokens['root']): 217 for i, pattern in enumerate(tokens['root']):
212 if pattern[1] == Keyword: 218 if pattern[1] == Keyword:
213 tokens['root'][i] = ( 219 tokens['root'][i] = (
237 243
238 name = 'PostgreSQL console - regexp based lexer' 244 name = 'PostgreSQL console - regexp based lexer'
239 aliases = [] # not public 245 aliases = [] # not public
240 246
241 flags = re.IGNORECASE 247 flags = re.IGNORECASE
242 tokens = dict((k, l[:]) for (k, l) in iteritems(PostgresLexer.tokens)) 248 tokens = {k: l[:] for (k, l) in PostgresLexer.tokens.items()}
243 249
244 tokens['root'].append( 250 tokens['root'].append(
245 (r'\\[^\s]+', Keyword.Pseudo, 'psql-command')) 251 (r'\\[^\s]+', Keyword.Pseudo, 'psql-command'))
246 tokens['psql-command'] = [ 252 tokens['psql-command'] = [
247 (r'\n', Text, 'root'), 253 (r'\n', Text, 'root'),
251 (r"'(''|[^'])*'", String.Single), 257 (r"'(''|[^'])*'", String.Single),
252 (r"`([^`])*`", String.Backtick), 258 (r"`([^`])*`", String.Backtick),
253 (r"[^\s]+", String.Symbol), 259 (r"[^\s]+", String.Symbol),
254 ] 260 ]
255 261
262
256 re_prompt = re.compile(r'^(\S.*?)??[=\-\(\$\'\"][#>]') 263 re_prompt = re.compile(r'^(\S.*?)??[=\-\(\$\'\"][#>]')
257 re_psql_command = re.compile(r'\s*\\') 264 re_psql_command = re.compile(r'\s*\\')
258 re_end_command = re.compile(r';\s*(--.*?)?$') 265 re_end_command = re.compile(r';\s*(--.*?)?$')
259 re_psql_command = re.compile(r'(\s*)(\\.+?)(\s+)$') 266 re_psql_command = re.compile(r'(\s*)(\\.+?)(\s+)$')
260 re_error = re.compile(r'(ERROR|FATAL):') 267 re_error = re.compile(r'(ERROR|FATAL):')
261 re_message = re.compile( 268 re_message = re.compile(
262 r'((?:DEBUG|INFO|NOTICE|WARNING|ERROR|' 269 r'((?:DEBUG|INFO|NOTICE|WARNING|ERROR|'
263 r'FATAL|HINT|DETAIL|CONTEXT|LINE [0-9]+):)(.*?\n)') 270 r'FATAL|HINT|DETAIL|CONTEXT|LINE [0-9]+):)(.*?\n)')
264 271
265 272
266 class lookahead(object): 273 class lookahead:
267 """Wrap an iterator and allow pushing back an item.""" 274 """Wrap an iterator and allow pushing back an item."""
268 def __init__(self, x): 275 def __init__(self, x):
269 self.iter = iter(x) 276 self.iter = iter(x)
270 self._nextitem = None 277 self._nextitem = None
271 278
375 'root': [ 382 'root': [
376 (r'\s+', Text), 383 (r'\s+', Text),
377 (r'--.*\n?', Comment.Single), 384 (r'--.*\n?', Comment.Single),
378 (r'/\*', Comment.Multiline, 'multiline-comments'), 385 (r'/\*', Comment.Multiline, 'multiline-comments'),
379 (words(( 386 (words((
380 'ABORT', 'ABS', 'ABSOLUTE', 'ACCESS', 'ADA', 'ADD', 'ADMIN', 'AFTER', 'AGGREGATE', 387 'ABORT', 'ABS', 'ABSOLUTE', 'ACCESS', 'ADA', 'ADD', 'ADMIN', 'AFTER',
381 'ALIAS', 'ALL', 'ALLOCATE', 'ALTER', 'ANALYSE', 'ANALYZE', 'AND', 'ANY', 'ARE', 'AS', 388 'AGGREGATE', 'ALIAS', 'ALL', 'ALLOCATE', 'ALTER', 'ANALYSE', 'ANALYZE',
382 'ASC', 'ASENSITIVE', 'ASSERTION', 'ASSIGNMENT', 'ASYMMETRIC', 'AT', 'ATOMIC', 389 'AND', 'ANY', 'ARE', 'AS', 'ASC', 'ASENSITIVE', 'ASSERTION', 'ASSIGNMENT',
383 'AUTHORIZATION', 'AVG', 'BACKWARD', 'BEFORE', 'BEGIN', 'BETWEEN', 'BITVAR', 390 'ASYMMETRIC', 'AT', 'ATOMIC', 'AUTHORIZATION', 'AVG', 'BACKWARD',
384 'BIT_LENGTH', 'BOTH', 'BREADTH', 'BY', 'C', 'CACHE', 'CALL', 'CALLED', 'CARDINALITY', 391 'BEFORE', 'BEGIN', 'BETWEEN', 'BITVAR', 'BIT_LENGTH', 'BOTH', 'BREADTH',
385 'CASCADE', 'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CATALOG_NAME', 'CHAIN', 392 'BY', 'C', 'CACHE', 'CALL', 'CALLED', 'CARDINALITY', 'CASCADE',
393 'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CATALOG_NAME', 'CHAIN',
386 'CHARACTERISTICS', 'CHARACTER_LENGTH', 'CHARACTER_SET_CATALOG', 394 'CHARACTERISTICS', 'CHARACTER_LENGTH', 'CHARACTER_SET_CATALOG',
387 'CHARACTER_SET_NAME', 'CHARACTER_SET_SCHEMA', 'CHAR_LENGTH', 'CHECK', 395 'CHARACTER_SET_NAME', 'CHARACTER_SET_SCHEMA', 'CHAR_LENGTH', 'CHECK',
388 'CHECKED', 'CHECKPOINT', 'CLASS', 'CLASS_ORIGIN', 'CLOB', 'CLOSE', 'CLUSTER', 396 'CHECKED', 'CHECKPOINT', 'CLASS', 'CLASS_ORIGIN', 'CLOB', 'CLOSE',
389 'COALSECE', 'COBOL', 'COLLATE', 'COLLATION', 'COLLATION_CATALOG', 397 'CLUSTER', 'COALSECE', 'COBOL', 'COLLATE', 'COLLATION',
390 'COLLATION_NAME', 'COLLATION_SCHEMA', 'COLUMN', 'COLUMN_NAME', 398 'COLLATION_CATALOG', 'COLLATION_NAME', 'COLLATION_SCHEMA', 'COLUMN',
391 'COMMAND_FUNCTION', 'COMMAND_FUNCTION_CODE', 'COMMENT', 'COMMIT', 399 'COLUMN_NAME', 'COMMAND_FUNCTION', 'COMMAND_FUNCTION_CODE', 'COMMENT',
392 'COMMITTED', 'COMPLETION', 'CONDITION_NUMBER', 'CONNECT', 'CONNECTION', 400 'COMMIT', 'COMMITTED', 'COMPLETION', 'CONDITION_NUMBER', 'CONNECT',
393 'CONNECTION_NAME', 'CONSTRAINT', 'CONSTRAINTS', 'CONSTRAINT_CATALOG', 401 'CONNECTION', 'CONNECTION_NAME', 'CONSTRAINT', 'CONSTRAINTS',
394 'CONSTRAINT_NAME', 'CONSTRAINT_SCHEMA', 'CONSTRUCTOR', 'CONTAINS', 402 'CONSTRAINT_CATALOG', 'CONSTRAINT_NAME', 'CONSTRAINT_SCHEMA',
395 'CONTINUE', 'CONVERSION', 'CONVERT', 'COPY', 'CORRESPONTING', 'COUNT', 403 'CONSTRUCTOR', 'CONTAINS', 'CONTINUE', 'CONVERSION', 'CONVERT',
396 'CREATE', 'CREATEDB', 'CREATEUSER', 'CROSS', 'CUBE', 'CURRENT', 'CURRENT_DATE', 404 'COPY', 'CORRESPONTING', 'COUNT', 'CREATE', 'CREATEDB', 'CREATEUSER',
397 'CURRENT_PATH', 'CURRENT_ROLE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 405 'CROSS', 'CUBE', 'CURRENT', 'CURRENT_DATE', 'CURRENT_PATH',
398 'CURRENT_USER', 'CURSOR', 'CURSOR_NAME', 'CYCLE', 'DATA', 'DATABASE', 406 'CURRENT_ROLE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER',
407 'CURSOR', 'CURSOR_NAME', 'CYCLE', 'DATA', 'DATABASE',
399 'DATETIME_INTERVAL_CODE', 'DATETIME_INTERVAL_PRECISION', 'DAY', 408 'DATETIME_INTERVAL_CODE', 'DATETIME_INTERVAL_PRECISION', 'DAY',
400 'DEALLOCATE', 'DECLARE', 'DEFAULT', 'DEFAULTS', 'DEFERRABLE', 'DEFERRED', 409 'DEALLOCATE', 'DECLARE', 'DEFAULT', 'DEFAULTS', 'DEFERRABLE',
401 'DEFINED', 'DEFINER', 'DELETE', 'DELIMITER', 'DELIMITERS', 'DEREF', 'DESC', 410 'DEFERRED', 'DEFINED', 'DEFINER', 'DELETE', 'DELIMITER', 'DELIMITERS',
402 'DESCRIBE', 'DESCRIPTOR', 'DESTROY', 'DESTRUCTOR', 'DETERMINISTIC', 411 'DEREF', 'DESC', 'DESCRIBE', 'DESCRIPTOR', 'DESTROY', 'DESTRUCTOR',
403 'DIAGNOSTICS', 'DICTIONARY', 'DISCONNECT', 'DISPATCH', 'DISTINCT', 'DO', 412 'DETERMINISTIC', 'DIAGNOSTICS', 'DICTIONARY', 'DISCONNECT', 'DISPATCH',
404 'DOMAIN', 'DROP', 'DYNAMIC', 'DYNAMIC_FUNCTION', 'DYNAMIC_FUNCTION_CODE', 'EACH', 413 'DISTINCT', 'DO', 'DOMAIN', 'DROP', 'DYNAMIC', 'DYNAMIC_FUNCTION',
405 'ELSE', 'ELSIF', 'ENCODING', 'ENCRYPTED', 'END', 'END-EXEC', 'EQUALS', 'ESCAPE', 'EVERY', 414 'DYNAMIC_FUNCTION_CODE', 'EACH', 'ELSE', 'ELSIF', 'ENCODING',
406 'EXCEPTION', 'EXCEPT', 'EXCLUDING', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTING', 415 'ENCRYPTED', 'END', 'END-EXEC', 'EQUALS', 'ESCAPE', 'EVERY', 'EXCEPTION',
407 'EXISTS', 'EXPLAIN', 'EXTERNAL', 'EXTRACT', 'FALSE', 'FETCH', 'FINAL', 'FIRST', 'FOR', 416 'EXCEPT', 'EXCLUDING', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTING',
408 'FORCE', 'FOREIGN', 'FORTRAN', 'FORWARD', 'FOUND', 'FREE', 'FREEZE', 'FROM', 'FULL', 417 'EXISTS', 'EXPLAIN', 'EXTERNAL', 'EXTRACT', 'FALSE', 'FETCH', 'FINAL',
409 'FUNCTION', 'G', 'GENERAL', 'GENERATED', 'GET', 'GLOBAL', 'GO', 'GOTO', 'GRANT', 'GRANTED', 418 'FIRST', 'FOR', 'FORCE', 'FOREIGN', 'FORTRAN', 'FORWARD', 'FOUND', 'FREE',
410 'GROUP', 'GROUPING', 'HANDLER', 'HAVING', 'HIERARCHY', 'HOLD', 'HOST', 'IDENTITY', 'IF', 419 'FREEZE', 'FROM', 'FULL', 'FUNCTION', 'G', 'GENERAL', 'GENERATED', 'GET',
411 'IGNORE', 'ILIKE', 'IMMEDIATE', 'IMMUTABLE', 'IMPLEMENTATION', 'IMPLICIT', 'IN', 420 'GLOBAL', 'GO', 'GOTO', 'GRANT', 'GRANTED', 'GROUP', 'GROUPING',
412 'INCLUDING', 'INCREMENT', 'INDEX', 'INDITCATOR', 'INFIX', 'INHERITS', 'INITIALIZE', 421 'HANDLER', 'HAVING', 'HIERARCHY', 'HOLD', 'HOST', 'IDENTITY', 'IF',
413 'INITIALLY', 'INNER', 'INOUT', 'INPUT', 'INSENSITIVE', 'INSERT', 'INSTANTIABLE', 422 'IGNORE', 'ILIKE', 'IMMEDIATE', 'IMMEDIATELY', 'IMMUTABLE', 'IMPLEMENTATION', 'IMPLICIT',
414 'INSTEAD', 'INTERSECT', 'INTO', 'INVOKER', 'IS', 'ISNULL', 'ISOLATION', 'ITERATE', 'JOIN', 423 'IN', 'INCLUDING', 'INCREMENT', 'INDEX', 'INDITCATOR', 'INFIX',
415 'KEY', 'KEY_MEMBER', 'KEY_TYPE', 'LANCOMPILER', 'LANGUAGE', 'LARGE', 'LAST', 424 'INHERITS', 'INITIALIZE', 'INITIALLY', 'INNER', 'INOUT', 'INPUT',
416 'LATERAL', 'LEADING', 'LEFT', 'LENGTH', 'LESS', 'LEVEL', 'LIKE', 'LIMIT', 'LISTEN', 'LOAD', 425 'INSENSITIVE', 'INSERT', 'INSTANTIABLE', 'INSTEAD', 'INTERSECT', 'INTO',
417 'LOCAL', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATION', 'LOCATOR', 'LOCK', 'LOWER', 426 'INVOKER', 'IS', 'ISNULL', 'ISOLATION', 'ITERATE', 'JOIN', 'KEY',
418 'MAP', 'MATCH', 'MAX', 'MAXVALUE', 'MESSAGE_LENGTH', 'MESSAGE_OCTET_LENGTH', 427 'KEY_MEMBER', 'KEY_TYPE', 'LANCOMPILER', 'LANGUAGE', 'LARGE', 'LAST',
419 'MESSAGE_TEXT', 'METHOD', 'MIN', 'MINUTE', 'MINVALUE', 'MOD', 'MODE', 'MODIFIES', 428 'LATERAL', 'LEADING', 'LEFT', 'LENGTH', 'LESS', 'LEVEL', 'LIKE', 'LIMIT',
420 'MODIFY', 'MONTH', 'MORE', 'MOVE', 'MUMPS', 'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR', 429 'LISTEN', 'LOAD', 'LOCAL', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATION',
421 'NCLOB', 'NEW', 'NEXT', 'NO', 'NOCREATEDB', 'NOCREATEUSER', 'NONE', 'NOT', 'NOTHING', 430 'LOCATOR', 'LOCK', 'LOWER', 'MAP', 'MATCH', 'MAX', 'MAXVALUE',
422 'NOTIFY', 'NOTNULL', 'NULL', 'NULLABLE', 'NULLIF', 'OBJECT', 'OCTET_LENGTH', 'OF', 'OFF', 431 'MESSAGE_LENGTH', 'MESSAGE_OCTET_LENGTH', 'MESSAGE_TEXT', 'METHOD', 'MIN',
423 'OFFSET', 'OIDS', 'OLD', 'ON', 'ONLY', 'OPEN', 'OPERATION', 'OPERATOR', 'OPTION', 'OPTIONS', 432 'MINUTE', 'MINVALUE', 'MOD', 'MODE', 'MODIFIES', 'MODIFY', 'MONTH',
424 'OR', 'ORDER', 'ORDINALITY', 'OUT', 'OUTER', 'OUTPUT', 'OVERLAPS', 'OVERLAY', 'OVERRIDING', 433 'MORE', 'MOVE', 'MUMPS', 'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR', 'NCLOB',
425 'OWNER', 'PAD', 'PARAMETER', 'PARAMETERS', 'PARAMETER_MODE', 'PARAMATER_NAME', 434 'NEW', 'NEXT', 'NO', 'NOCREATEDB', 'NOCREATEUSER', 'NONE', 'NOT',
426 'PARAMATER_ORDINAL_POSITION', 'PARAMETER_SPECIFIC_CATALOG', 435 'NOTHING', 'NOTIFY', 'NOTNULL', 'NULL', 'NULLABLE', 'NULLIF', 'OBJECT',
427 'PARAMETER_SPECIFIC_NAME', 'PARAMATER_SPECIFIC_SCHEMA', 'PARTIAL', 436 'OCTET_LENGTH', 'OF', 'OFF', 'OFFSET', 'OIDS', 'OLD', 'ON', 'ONLY',
428 'PASCAL', 'PENDANT', 'PLACING', 'PLI', 'POSITION', 'POSTFIX', 'PRECISION', 'PREFIX', 437 'OPEN', 'OPERATION', 'OPERATOR', 'OPTION', 'OPTIONS', 'OR', 'ORDER',
429 'PREORDER', 'PREPARE', 'PRESERVE', 'PRIMARY', 'PRIOR', 'PRIVILEGES', 'PROCEDURAL', 438 'ORDINALITY', 'OUT', 'OUTER', 'OUTPUT', 'OVERLAPS', 'OVERLAY',
430 'PROCEDURE', 'PUBLIC', 'READ', 'READS', 'RECHECK', 'RECURSIVE', 'REF', 'REFERENCES', 439 'OVERRIDING', 'OWNER', 'PAD', 'PARAMETER', 'PARAMETERS', 'PARAMETER_MODE',
431 'REFERENCING', 'REINDEX', 'RELATIVE', 'RENAME', 'REPEATABLE', 'REPLACE', 'RESET', 440 'PARAMATER_NAME', 'PARAMATER_ORDINAL_POSITION',
432 'RESTART', 'RESTRICT', 'RESULT', 'RETURN', 'RETURNED_LENGTH', 441 'PARAMETER_SPECIFIC_CATALOG', 'PARAMETER_SPECIFIC_NAME',
433 'RETURNED_OCTET_LENGTH', 'RETURNED_SQLSTATE', 'RETURNS', 'REVOKE', 'RIGHT', 442 'PARAMATER_SPECIFIC_SCHEMA', 'PARTIAL', 'PASCAL', 'PENDANT', 'PERIOD', 'PLACING',
434 'ROLE', 'ROLLBACK', 'ROLLUP', 'ROUTINE', 'ROUTINE_CATALOG', 'ROUTINE_NAME', 443 'PLI', 'POSITION', 'POSTFIX', 'PRECEEDS', 'PRECISION', 'PREFIX', 'PREORDER',
435 'ROUTINE_SCHEMA', 'ROW', 'ROWS', 'ROW_COUNT', 'RULE', 'SAVE_POINT', 'SCALE', 'SCHEMA', 444 'PREPARE', 'PRESERVE', 'PRIMARY', 'PRIOR', 'PRIVILEGES', 'PROCEDURAL',
436 'SCHEMA_NAME', 'SCOPE', 'SCROLL', 'SEARCH', 'SECOND', 'SECURITY', 'SELECT', 'SELF', 445 'PROCEDURE', 'PUBLIC', 'READ', 'READS', 'RECHECK', 'RECURSIVE', 'REF',
437 'SENSITIVE', 'SERIALIZABLE', 'SERVER_NAME', 'SESSION', 'SESSION_USER', 'SET', 446 'REFERENCES', 'REFERENCING', 'REINDEX', 'RELATIVE', 'RENAME',
438 'SETOF', 'SETS', 'SHARE', 'SHOW', 'SIMILAR', 'SIMPLE', 'SIZE', 'SOME', 'SOURCE', 'SPACE', 447 'REPEATABLE', 'REPLACE', 'RESET', 'RESTART', 'RESTRICT', 'RESULT',
439 'SPECIFIC', 'SPECIFICTYPE', 'SPECIFIC_NAME', 'SQL', 'SQLCODE', 'SQLERROR', 448 'RETURN', 'RETURNED_LENGTH', 'RETURNED_OCTET_LENGTH', 'RETURNED_SQLSTATE',
440 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNINIG', 'STABLE', 'START', 'STATE', 'STATEMENT', 449 'RETURNS', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', 'ROLLUP', 'ROUTINE',
441 'STATIC', 'STATISTICS', 'STDIN', 'STDOUT', 'STORAGE', 'STRICT', 'STRUCTURE', 'STYPE', 450 'ROUTINE_CATALOG', 'ROUTINE_NAME', 'ROUTINE_SCHEMA', 'ROW', 'ROWS',
442 'SUBCLASS_ORIGIN', 'SUBLIST', 'SUBSTRING', 'SUM', 'SYMMETRIC', 'SYSID', 'SYSTEM', 451 'ROW_COUNT', 'RULE', 'SAVE_POINT', 'SCALE', 'SCHEMA', 'SCHEMA_NAME',
443 'SYSTEM_USER', 'TABLE', 'TABLE_NAME', ' TEMP', 'TEMPLATE', 'TEMPORARY', 'TERMINATE', 452 'SCOPE', 'SCROLL', 'SEARCH', 'SECOND', 'SECURITY', 'SELECT', 'SELF',
444 'THAN', 'THEN', 'TIMESTAMP', 'TIMEZONE_HOUR', 'TIMEZONE_MINUTE', 'TO', 'TOAST', 453 'SENSITIVE', 'SERIALIZABLE', 'SERVER_NAME', 'SESSION', 'SESSION_USER',
445 'TRAILING', 'TRANSATION', 'TRANSACTIONS_COMMITTED', 454 'SET', 'SETOF', 'SETS', 'SHARE', 'SHOW', 'SIMILAR', 'SIMPLE', 'SIZE',
446 'TRANSACTIONS_ROLLED_BACK', 'TRANSATION_ACTIVE', 'TRANSFORM', 455 'SOME', 'SOURCE', 'SPACE', 'SPECIFIC', 'SPECIFICTYPE', 'SPECIFIC_NAME',
447 'TRANSFORMS', 'TRANSLATE', 'TRANSLATION', 'TREAT', 'TRIGGER', 'TRIGGER_CATALOG', 456 'SQL', 'SQLCODE', 'SQLERROR', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNINIG',
448 'TRIGGER_NAME', 'TRIGGER_SCHEMA', 'TRIM', 'TRUE', 'TRUNCATE', 'TRUSTED', 'TYPE', 457 'STABLE', 'START', 'STATE', 'STATEMENT', 'STATIC', 'STATISTICS', 'STDIN',
449 'UNCOMMITTED', 'UNDER', 'UNENCRYPTED', 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLISTEN', 458 'STDOUT', 'STORAGE', 'STRICT', 'STRUCTURE', 'STYPE', 'SUBCLASS_ORIGIN',
450 'UNNAMED', 'UNNEST', 'UNTIL', 'UPDATE', 'UPPER', 'USAGE', 'USER', 459 'SUBLIST', 'SUBSTRING', 'SUCCEEDS', 'SUM', 'SYMMETRIC', 'SYSID', 'SYSTEM',
451 'USER_DEFINED_TYPE_CATALOG', 'USER_DEFINED_TYPE_NAME', 460 'SYSTEM_USER', 'TABLE', 'TABLE_NAME', ' TEMP', 'TEMPLATE', 'TEMPORARY',
452 'USER_DEFINED_TYPE_SCHEMA', 'USING', 'VACUUM', 'VALID', 'VALIDATOR', 'VALUES', 461 'TERMINATE', 'THAN', 'THEN', 'TIME', 'TIMESTAMP', 'TIMEZONE_HOUR',
453 'VARIABLE', 'VERBOSE', 'VERSION', 'VIEW', 'VOLATILE', 'WHEN', 'WHENEVER', 'WHERE', 462 'TIMEZONE_MINUTE', 'TO', 'TOAST', 'TRAILING', 'TRANSATION',
454 'WITH', 'WITHOUT', 'WORK', 'WRITE', 'YEAR', 'ZONE'), suffix=r'\b'), 463 'TRANSACTIONS_COMMITTED', 'TRANSACTIONS_ROLLED_BACK', 'TRANSATION_ACTIVE',
464 'TRANSFORM', 'TRANSFORMS', 'TRANSLATE', 'TRANSLATION', 'TREAT', 'TRIGGER',
465 'TRIGGER_CATALOG', 'TRIGGER_NAME', 'TRIGGER_SCHEMA', 'TRIM', 'TRUE',
466 'TRUNCATE', 'TRUSTED', 'TYPE', 'UNCOMMITTED', 'UNDER', 'UNENCRYPTED',
467 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLISTEN', 'UNNAMED', 'UNNEST', 'UNTIL',
468 'UPDATE', 'UPPER', 'USAGE', 'USER', 'USER_DEFINED_TYPE_CATALOG',
469 'USER_DEFINED_TYPE_NAME', 'USER_DEFINED_TYPE_SCHEMA', 'USING', 'VACUUM',
470 'VALID', 'VALIDATOR', 'VALUES', 'VARIABLE', 'VERBOSE',
471 'VERSION', 'VERSIONS', 'VERSIONING', 'VIEW',
472 'VOLATILE', 'WHEN', 'WHENEVER', 'WHERE', 'WITH', 'WITHOUT', 'WORK',
473 'WRITE', 'YEAR', 'ZONE'), suffix=r'\b'),
455 Keyword), 474 Keyword),
456 (words(( 475 (words((
457 'ARRAY', 'BIGINT', 'BINARY', 'BIT', 'BLOB', 'BOOLEAN', 'CHAR', 'CHARACTER', 'DATE', 476 'ARRAY', 'BIGINT', 'BINARY', 'BIT', 'BLOB', 'BOOLEAN', 'CHAR',
458 'DEC', 'DECIMAL', 'FLOAT', 'INT', 'INTEGER', 'INTERVAL', 'NUMBER', 'NUMERIC', 'REAL', 477 'CHARACTER', 'DATE', 'DEC', 'DECIMAL', 'FLOAT', 'INT', 'INTEGER',
459 'SERIAL', 'SMALLINT', 'VARCHAR', 'VARYING', 'INT8', 'SERIAL8', 'TEXT'), suffix=r'\b'), 478 'INTERVAL', 'NUMBER', 'NUMERIC', 'REAL', 'SERIAL', 'SMALLINT',
479 'VARCHAR', 'VARYING', 'INT8', 'SERIAL8', 'TEXT'), suffix=r'\b'),
460 Name.Builtin), 480 Name.Builtin),
461 (r'[+*/<>=~!@#%^&|`?-]', Operator), 481 (r'[+*/<>=~!@#%^&|`?-]', Operator),
462 (r'[0-9]+', Number.Integer), 482 (r'[0-9]+', Number.Integer),
463 # TODO: Backslash escapes? 483 # TODO: Backslash escapes?
464 (r"'(''|[^'])*'", String.Single), 484 (r"'(''|[^'])*'", String.Single),
471 (r'\*/', Comment.Multiline, '#pop'), 491 (r'\*/', Comment.Multiline, '#pop'),
472 (r'[^/*]+', Comment.Multiline), 492 (r'[^/*]+', Comment.Multiline),
473 (r'[/*]', Comment.Multiline) 493 (r'[/*]', Comment.Multiline)
474 ] 494 ]
475 } 495 }
496
497 def analyse_text(text):
498 return 0.01
476 499
477 500
478 class TransactSqlLexer(RegexLexer): 501 class TransactSqlLexer(RegexLexer):
479 """ 502 """
480 Transact-SQL (T-SQL) is Microsoft's and Sybase's proprietary extension to 503 Transact-SQL (T-SQL) is Microsoft's and Sybase's proprietary extension to
527 (r'\*/', Comment.Multiline, '#pop'), 550 (r'\*/', Comment.Multiline, '#pop'),
528 (r'[^/*]+', Comment.Multiline), 551 (r'[^/*]+', Comment.Multiline),
529 (r'[/*]', Comment.Multiline) 552 (r'[/*]', Comment.Multiline)
530 ] 553 ]
531 } 554 }
555
556 def analyse_text(text):
557 rating = 0
558 if tsql_declare_re.search(text):
559 # Found T-SQL variable declaration.
560 rating = 1.0
561 else:
562 name_between_backtick_count = len(
563 name_between_backtick_re.findall(text))
564 name_between_bracket_count = len(
565 name_between_bracket_re.findall(text))
566 # We need to check if there are any names using
567 # backticks or brackets, as otherwise both are 0
568 # and 0 >= 2 * 0, so we would always assume it's true
569 dialect_name_count = name_between_backtick_count + name_between_bracket_count
570 if dialect_name_count >= 1 and \
571 name_between_bracket_count >= 2 * name_between_backtick_count:
572 # Found at least twice as many [name] as `name`.
573 rating += 0.5
574 elif name_between_bracket_count > name_between_backtick_count:
575 rating += 0.2
576 elif name_between_bracket_count > 0:
577 rating += 0.1
578 if tsql_variable_re.search(text) is not None:
579 rating += 0.1
580 if tsql_go_re.search(text) is not None:
581 rating += 0.1
582 return rating
532 583
533 584
534 class MySqlLexer(RegexLexer): 585 class MySqlLexer(RegexLexer):
535 """ 586 """
536 Special lexer for MySQL. 587 Special lexer for MySQL.
601 (r'[^/*]+', Comment.Multiline), 652 (r'[^/*]+', Comment.Multiline),
602 (r'[/*]', Comment.Multiline) 653 (r'[/*]', Comment.Multiline)
603 ] 654 ]
604 } 655 }
605 656
657 def analyse_text(text):
658 rating = 0
659 name_between_backtick_count = len(
660 name_between_backtick_re.findall(text))
661 name_between_bracket_count = len(
662 name_between_bracket_re.findall(text))
663 # Same logic as above in the TSQL analysis
664 dialect_name_count = name_between_backtick_count + name_between_bracket_count
665 if dialect_name_count >= 1 and \
666 name_between_backtick_count >= 2 * name_between_bracket_count:
667 # Found at least twice as many `name` as [name].
668 rating += 0.5
669 elif name_between_backtick_count > name_between_bracket_count:
670 rating += 0.2
671 elif name_between_backtick_count > 0:
672 rating += 0.1
673 return rating
674
606 675
607 class SqliteConsoleLexer(Lexer): 676 class SqliteConsoleLexer(Lexer):
608 """ 677 """
609 Lexer for example sessions using sqlite3. 678 Lexer for example sessions using sqlite3.
610 679

eric ide

mercurial