Coverage for /home/martinb/.local/share/virtualenvs/camcops/lib/python3.6/site-packages/pygments/lexers/_postgres_builtins.py : 100%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
2"""
3 pygments.lexers._postgres_builtins
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 Self-updating data files for PostgreSQL lexer.
8 :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
9 :license: BSD, see LICENSE for details.
10"""
13# Autogenerated: please edit them if you like wasting your time.
15KEYWORDS = (
16 'ABORT',
17 'ABSOLUTE',
18 'ACCESS',
19 'ACTION',
20 'ADD',
21 'ADMIN',
22 'AFTER',
23 'AGGREGATE',
24 'ALL',
25 'ALSO',
26 'ALTER',
27 'ALWAYS',
28 'ANALYSE',
29 'ANALYZE',
30 'AND',
31 'ANY',
32 'ARRAY',
33 'AS',
34 'ASC',
35 'ASSERTION',
36 'ASSIGNMENT',
37 'ASYMMETRIC',
38 'AT',
39 'ATTACH',
40 'ATTRIBUTE',
41 'AUTHORIZATION',
42 'BACKWARD',
43 'BEFORE',
44 'BEGIN',
45 'BETWEEN',
46 'BIGINT',
47 'BINARY',
48 'BIT',
49 'BOOLEAN',
50 'BOTH',
51 'BY',
52 'CACHE',
53 'CALL',
54 'CALLED',
55 'CASCADE',
56 'CASCADED',
57 'CASE',
58 'CAST',
59 'CATALOG',
60 'CHAIN',
61 'CHAR',
62 'CHARACTER',
63 'CHARACTERISTICS',
64 'CHECK',
65 'CHECKPOINT',
66 'CLASS',
67 'CLOSE',
68 'CLUSTER',
69 'COALESCE',
70 'COLLATE',
71 'COLLATION',
72 'COLUMN',
73 'COLUMNS',
74 'COMMENT',
75 'COMMENTS',
76 'COMMIT',
77 'COMMITTED',
78 'CONCURRENTLY',
79 'CONFIGURATION',
80 'CONFLICT',
81 'CONNECTION',
82 'CONSTRAINT',
83 'CONSTRAINTS',
84 'CONTENT',
85 'CONTINUE',
86 'CONVERSION',
87 'COPY',
88 'COST',
89 'CREATE',
90 'CROSS',
91 'CSV',
92 'CUBE',
93 'CURRENT',
94 'CURRENT_CATALOG',
95 'CURRENT_DATE',
96 'CURRENT_ROLE',
97 'CURRENT_SCHEMA',
98 'CURRENT_TIME',
99 'CURRENT_TIMESTAMP',
100 'CURRENT_USER',
101 'CURSOR',
102 'CYCLE',
103 'DATA',
104 'DATABASE',
105 'DAY',
106 'DEALLOCATE',
107 'DEC',
108 'DECIMAL',
109 'DECLARE',
110 'DEFAULT',
111 'DEFAULTS',
112 'DEFERRABLE',
113 'DEFERRED',
114 'DEFINER',
115 'DELETE',
116 'DELIMITER',
117 'DELIMITERS',
118 'DEPENDS',
119 'DESC',
120 'DETACH',
121 'DICTIONARY',
122 'DISABLE',
123 'DISCARD',
124 'DISTINCT',
125 'DO',
126 'DOCUMENT',
127 'DOMAIN',
128 'DOUBLE',
129 'DROP',
130 'EACH',
131 'ELSE',
132 'ENABLE',
133 'ENCODING',
134 'ENCRYPTED',
135 'END',
136 'ENUM',
137 'ESCAPE',
138 'EVENT',
139 'EXCEPT',
140 'EXCLUDE',
141 'EXCLUDING',
142 'EXCLUSIVE',
143 'EXECUTE',
144 'EXISTS',
145 'EXPLAIN',
146 'EXPRESSION',
147 'EXTENSION',
148 'EXTERNAL',
149 'EXTRACT',
150 'FALSE',
151 'FAMILY',
152 'FETCH',
153 'FILTER',
154 'FIRST',
155 'FLOAT',
156 'FOLLOWING',
157 'FOR',
158 'FORCE',
159 'FOREIGN',
160 'FORWARD',
161 'FREEZE',
162 'FROM',
163 'FULL',
164 'FUNCTION',
165 'FUNCTIONS',
166 'GENERATED',
167 'GLOBAL',
168 'GRANT',
169 'GRANTED',
170 'GREATEST',
171 'GROUP',
172 'GROUPING',
173 'GROUPS',
174 'HANDLER',
175 'HAVING',
176 'HEADER',
177 'HOLD',
178 'HOUR',
179 'IDENTITY',
180 'IF',
181 'ILIKE',
182 'IMMEDIATE',
183 'IMMUTABLE',
184 'IMPLICIT',
185 'IMPORT',
186 'IN',
187 'INCLUDE',
188 'INCLUDING',
189 'INCREMENT',
190 'INDEX',
191 'INDEXES',
192 'INHERIT',
193 'INHERITS',
194 'INITIALLY',
195 'INLINE',
196 'INNER',
197 'INOUT',
198 'INPUT',
199 'INSENSITIVE',
200 'INSERT',
201 'INSTEAD',
202 'INT',
203 'INTEGER',
204 'INTERSECT',
205 'INTERVAL',
206 'INTO',
207 'INVOKER',
208 'IS',
209 'ISNULL',
210 'ISOLATION',
211 'JOIN',
212 'KEY',
213 'LABEL',
214 'LANGUAGE',
215 'LARGE',
216 'LAST',
217 'LATERAL',
218 'LEADING',
219 'LEAKPROOF',
220 'LEAST',
221 'LEFT',
222 'LEVEL',
223 'LIKE',
224 'LIMIT',
225 'LISTEN',
226 'LOAD',
227 'LOCAL',
228 'LOCALTIME',
229 'LOCALTIMESTAMP',
230 'LOCATION',
231 'LOCK',
232 'LOCKED',
233 'LOGGED',
234 'MAPPING',
235 'MATCH',
236 'MATERIALIZED',
237 'MAXVALUE',
238 'METHOD',
239 'MINUTE',
240 'MINVALUE',
241 'MODE',
242 'MONTH',
243 'MOVE',
244 'NAME',
245 'NAMES',
246 'NATIONAL',
247 'NATURAL',
248 'NCHAR',
249 'NEW',
250 'NEXT',
251 'NFC',
252 'NFD',
253 'NFKC',
254 'NFKD',
255 'NO',
256 'NONE',
257 'NORMALIZE',
258 'NORMALIZED',
259 'NOT',
260 'NOTHING',
261 'NOTIFY',
262 'NOTNULL',
263 'NOWAIT',
264 'NULL',
265 'NULLIF',
266 'NULLS',
267 'NUMERIC',
268 'OBJECT',
269 'OF',
270 'OFF',
271 'OFFSET',
272 'OIDS',
273 'OLD',
274 'ON',
275 'ONLY',
276 'OPERATOR',
277 'OPTION',
278 'OPTIONS',
279 'OR',
280 'ORDER',
281 'ORDINALITY',
282 'OTHERS',
283 'OUT',
284 'OUTER',
285 'OVER',
286 'OVERLAPS',
287 'OVERLAY',
288 'OVERRIDING',
289 'OWNED',
290 'OWNER',
291 'PARALLEL',
292 'PARSER',
293 'PARTIAL',
294 'PARTITION',
295 'PASSING',
296 'PASSWORD',
297 'PLACING',
298 'PLANS',
299 'POLICY',
300 'POSITION',
301 'PRECEDING',
302 'PRECISION',
303 'PREPARE',
304 'PREPARED',
305 'PRESERVE',
306 'PRIMARY',
307 'PRIOR',
308 'PRIVILEGES',
309 'PROCEDURAL',
310 'PROCEDURE',
311 'PROCEDURES',
312 'PROGRAM',
313 'PUBLICATION',
314 'QUOTE',
315 'RANGE',
316 'READ',
317 'REAL',
318 'REASSIGN',
319 'RECHECK',
320 'RECURSIVE',
321 'REF',
322 'REFERENCES',
323 'REFERENCING',
324 'REFRESH',
325 'REINDEX',
326 'RELATIVE',
327 'RELEASE',
328 'RENAME',
329 'REPEATABLE',
330 'REPLACE',
331 'REPLICA',
332 'RESET',
333 'RESTART',
334 'RESTRICT',
335 'RETURNING',
336 'RETURNS',
337 'REVOKE',
338 'RIGHT',
339 'ROLE',
340 'ROLLBACK',
341 'ROLLUP',
342 'ROUTINE',
343 'ROUTINES',
344 'ROW',
345 'ROWS',
346 'RULE',
347 'SAVEPOINT',
348 'SCHEMA',
349 'SCHEMAS',
350 'SCROLL',
351 'SEARCH',
352 'SECOND',
353 'SECURITY',
354 'SELECT',
355 'SEQUENCE',
356 'SEQUENCES',
357 'SERIALIZABLE',
358 'SERVER',
359 'SESSION',
360 'SESSION_USER',
361 'SET',
362 'SETOF',
363 'SETS',
364 'SHARE',
365 'SHOW',
366 'SIMILAR',
367 'SIMPLE',
368 'SKIP',
369 'SMALLINT',
370 'SNAPSHOT',
371 'SOME',
372 'SQL',
373 'STABLE',
374 'STANDALONE',
375 'START',
376 'STATEMENT',
377 'STATISTICS',
378 'STDIN',
379 'STDOUT',
380 'STORAGE',
381 'STORED',
382 'STRICT',
383 'STRIP',
384 'SUBSCRIPTION',
385 'SUBSTRING',
386 'SUPPORT',
387 'SYMMETRIC',
388 'SYSID',
389 'SYSTEM',
390 'TABLE',
391 'TABLES',
392 'TABLESAMPLE',
393 'TABLESPACE',
394 'TEMP',
395 'TEMPLATE',
396 'TEMPORARY',
397 'TEXT',
398 'THEN',
399 'TIES',
400 'TIME',
401 'TIMESTAMP',
402 'TO',
403 'TRAILING',
404 'TRANSACTION',
405 'TRANSFORM',
406 'TREAT',
407 'TRIGGER',
408 'TRIM',
409 'TRUE',
410 'TRUNCATE',
411 'TRUSTED',
412 'TYPE',
413 'TYPES',
414 'UESCAPE',
415 'UNBOUNDED',
416 'UNCOMMITTED',
417 'UNENCRYPTED',
418 'UNION',
419 'UNIQUE',
420 'UNKNOWN',
421 'UNLISTEN',
422 'UNLOGGED',
423 'UNTIL',
424 'UPDATE',
425 'USER',
426 'USING',
427 'VACUUM',
428 'VALID',
429 'VALIDATE',
430 'VALIDATOR',
431 'VALUE',
432 'VALUES',
433 'VARCHAR',
434 'VARIADIC',
435 'VARYING',
436 'VERBOSE',
437 'VERSION',
438 'VIEW',
439 'VIEWS',
440 'VOLATILE',
441 'WHEN',
442 'WHERE',
443 'WHITESPACE',
444 'WINDOW',
445 'WITH',
446 'WITHIN',
447 'WITHOUT',
448 'WORK',
449 'WRAPPER',
450 'WRITE',
451 'XML',
452 'XMLATTRIBUTES',
453 'XMLCONCAT',
454 'XMLELEMENT',
455 'XMLEXISTS',
456 'XMLFOREST',
457 'XMLNAMESPACES',
458 'XMLPARSE',
459 'XMLPI',
460 'XMLROOT',
461 'XMLSERIALIZE',
462 'XMLTABLE',
463 'YEAR',
464 'YES',
465 'ZONE',
466)
468DATATYPES = (
469 'bigint',
470 'bigserial',
471 'bit',
472 'bit varying',
473 'bool',
474 'boolean',
475 'box',
476 'bytea',
477 'char',
478 'character',
479 'character varying',
480 'cidr',
481 'circle',
482 'date',
483 'decimal',
484 'double precision',
485 'float4',
486 'float8',
487 'inet',
488 'int',
489 'int2',
490 'int4',
491 'int8',
492 'integer',
493 'interval',
494 'json',
495 'jsonb',
496 'line',
497 'lseg',
498 'macaddr',
499 'macaddr8',
500 'money',
501 'numeric',
502 'path',
503 'pg_lsn',
504 'pg_snapshot',
505 'point',
506 'polygon',
507 'real',
508 'serial',
509 'serial2',
510 'serial4',
511 'serial8',
512 'smallint',
513 'smallserial',
514 'text',
515 'time',
516 'timestamp',
517 'timestamptz',
518 'timetz',
519 'tsquery',
520 'tsvector',
521 'txid_snapshot',
522 'uuid',
523 'varbit',
524 'varchar',
525 'with time zone',
526 'without time zone',
527 'xml',
528)
530PSEUDO_TYPES = (
531 'any',
532 'anyarray',
533 'anycompatible',
534 'anycompatiblearray',
535 'anycompatiblenonarray',
536 'anycompatiblerange',
537 'anyelement',
538 'anyenum',
539 'anynonarray',
540 'anyrange',
541 'cstring',
542 'event_trigger',
543 'fdw_handler',
544 'index_am_handler',
545 'internal',
546 'language_handler',
547 'pg_ddl_command',
548 'record',
549 'table_am_handler',
550 'trigger',
551 'tsm_handler',
552 'unknown',
553 'void',
554)
556# Remove 'trigger' from types
557PSEUDO_TYPES = tuple(sorted(set(PSEUDO_TYPES) - set(map(str.lower, KEYWORDS))))
559PLPGSQL_KEYWORDS = (
560 'ALIAS', 'CONSTANT', 'DIAGNOSTICS', 'ELSIF', 'EXCEPTION', 'EXIT',
561 'FOREACH', 'GET', 'LOOP', 'NOTICE', 'OPEN', 'PERFORM', 'QUERY', 'RAISE',
562 'RETURN', 'REVERSE', 'SQLSTATE', 'WHILE',
563)
566if __name__ == '__main__': # pragma: no cover
567 import re
568 try:
569 from urllib import urlopen
570 except ImportError:
571 from urllib.request import urlopen
573 from pygments.util import format_lines
575 # One man's constant is another man's variable.
576 SOURCE_URL = 'https://github.com/postgres/postgres/raw/master'
577 KEYWORDS_URL = SOURCE_URL + '/src/include/parser/kwlist.h'
578 DATATYPES_URL = SOURCE_URL + '/doc/src/sgml/datatype.sgml'
580 def update_myself():
581 content = urlopen(DATATYPES_URL).read().decode('utf-8', errors='ignore')
582 data_file = list(content.splitlines())
583 datatypes = parse_datatypes(data_file)
584 pseudos = parse_pseudos(data_file)
586 content = urlopen(KEYWORDS_URL).read().decode('utf-8', errors='ignore')
587 keywords = parse_keywords(content)
589 update_consts(__file__, 'DATATYPES', datatypes)
590 update_consts(__file__, 'PSEUDO_TYPES', pseudos)
591 update_consts(__file__, 'KEYWORDS', keywords)
593 def parse_keywords(f):
594 kw = []
595 for m in re.finditer(r'PG_KEYWORD\("(.+?)"', f):
596 kw.append(m.group(1).upper())
598 if not kw:
599 raise ValueError('no keyword found')
601 kw.sort()
602 return kw
604 def parse_datatypes(f):
605 dt = set()
606 for line in f:
607 if '<sect1' in line:
608 break
609 if '<entry><type>' not in line:
610 continue
612 # Parse a string such as
613 # time [ (<replaceable>p</replaceable>) ] [ without time zone ]
614 # into types "time" and "without time zone"
616 # remove all the tags
617 line = re.sub("<replaceable>[^<]+</replaceable>", "", line)
618 line = re.sub("<[^>]+>", "", line)
620 # Drop the parts containing braces
621 for tmp in [t for tmp in line.split('[')
622 for t in tmp.split(']') if "(" not in t]:
623 for t in tmp.split(','):
624 t = t.strip()
625 if not t: continue
626 dt.add(" ".join(t.split()))
628 dt = list(dt)
629 dt.sort()
630 return dt
632 def parse_pseudos(f):
633 dt = []
634 re_start = re.compile(r'\s*<table id="datatype-pseudotypes-table">')
635 re_entry = re.compile(r'\s*<entry><type>(.+?)</type></entry>')
636 re_end = re.compile(r'\s*</table>')
638 f = iter(f)
639 for line in f:
640 if re_start.match(line) is not None:
641 break
642 else:
643 raise ValueError('pseudo datatypes table not found')
645 for line in f:
646 m = re_entry.match(line)
647 if m is not None:
648 dt.append(m.group(1))
650 if re_end.match(line) is not None:
651 break
652 else:
653 raise ValueError('end of pseudo datatypes table not found')
655 if not dt:
656 raise ValueError('pseudo datatypes not found')
658 dt.sort()
659 return dt
661 def update_consts(filename, constname, content):
662 with open(filename) as f:
663 data = f.read()
665 # Line to start/end inserting
666 re_match = re.compile(r'^%s\s*=\s*\($.*?^\s*\)$' % constname, re.M | re.S)
667 m = re_match.search(data)
668 if not m:
669 raise ValueError('Could not find existing definition for %s' %
670 (constname,))
672 new_block = format_lines(constname, content)
673 data = data[:m.start()] + new_block + data[m.end():]
675 with open(filename, 'w', newline='\n') as f:
676 f.write(data)
678 update_myself()