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