Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/pygments/lexers/_postgres_builtins.py: 100%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

7 statements  

1""" 

2 pygments.lexers._postgres_builtins 

3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

4 

5 Self-updating data files for PostgreSQL lexer. 

6 

7 Run with `python -I` to update itself. 

8 

9 :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. 

10 :license: BSD, see LICENSE for details. 

11""" 

12 

13# Autogenerated: please edit them if you like wasting your time. 

14 

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) 

474 

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) 

536 

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) 

564 

565# Remove 'trigger' from types 

566PSEUDO_TYPES = tuple(sorted(set(PSEUDO_TYPES) - set(map(str.lower, KEYWORDS)))) 

567 

568PLPGSQL_KEYWORDS = ( 

569 'ALIAS', 'CONSTANT', 'DIAGNOSTICS', 'ELSIF', 'EXCEPTION', 'EXIT', 

570 'FOREACH', 'GET', 'LOOP', 'NOTICE', 'OPEN', 'PERFORM', 'QUERY', 'RAISE', 

571 'RETURN', 'REVERSE', 'SQLSTATE', 'WHILE', 

572) 

573 

574# Most of these keywords are from ExplainNode function 

575# in src/backend/commands/explain.c 

576 

577EXPLAIN_KEYWORDS = ( 

578 'Aggregate', 

579 'Append', 

580 'Bitmap Heap Scan', 

581 'Bitmap Index Scan', 

582 'BitmapAnd', 

583 'BitmapOr', 

584 'CTE Scan', 

585 'Custom Scan', 

586 'Delete', 

587 'Foreign Scan', 

588 'Function Scan', 

589 'Gather Merge', 

590 'Gather', 

591 'Group', 

592 'GroupAggregate', 

593 'Hash Join', 

594 'Hash', 

595 'HashAggregate', 

596 'Incremental Sort', 

597 'Index Only Scan', 

598 'Index Scan', 

599 'Insert', 

600 'Limit', 

601 'LockRows', 

602 'Materialize', 

603 'Memoize', 

604 'Merge Append', 

605 'Merge Join', 

606 'Merge', 

607 'MixedAggregate', 

608 'Named Tuplestore Scan', 

609 'Nested Loop', 

610 'ProjectSet', 

611 'Recursive Union', 

612 'Result', 

613 'Sample Scan', 

614 'Seq Scan', 

615 'SetOp', 

616 'Sort', 

617 'SubPlan', 

618 'Subquery Scan', 

619 'Table Function Scan', 

620 'Tid Range Scan', 

621 'Tid Scan', 

622 'Unique', 

623 'Update', 

624 'Values Scan', 

625 'WindowAgg', 

626 'WorkTable Scan', 

627) 

628 

629 

630if __name__ == '__main__': # pragma: no cover 

631 import re 

632 from urllib.request import urlopen 

633 

634 from pygments.util import format_lines 

635 

636 # One man's constant is another man's variable. 

637 SOURCE_URL = 'https://github.com/postgres/postgres/raw/master' 

638 KEYWORDS_URL = SOURCE_URL + '/src/include/parser/kwlist.h' 

639 DATATYPES_URL = SOURCE_URL + '/doc/src/sgml/datatype.sgml' 

640 

641 def update_myself(): 

642 content = urlopen(DATATYPES_URL).read().decode('utf-8', errors='ignore') 

643 data_file = list(content.splitlines()) 

644 datatypes = parse_datatypes(data_file) 

645 pseudos = parse_pseudos(data_file) 

646 

647 content = urlopen(KEYWORDS_URL).read().decode('utf-8', errors='ignore') 

648 keywords = parse_keywords(content) 

649 

650 update_consts(__file__, 'DATATYPES', datatypes) 

651 update_consts(__file__, 'PSEUDO_TYPES', pseudos) 

652 update_consts(__file__, 'KEYWORDS', keywords) 

653 

654 def parse_keywords(f): 

655 kw = [] 

656 for m in re.finditer(r'PG_KEYWORD\("(.+?)"', f): 

657 kw.append(m.group(1).upper()) 

658 

659 if not kw: 

660 raise ValueError('no keyword found') 

661 

662 kw.sort() 

663 return kw 

664 

665 def parse_datatypes(f): 

666 dt = set() 

667 for line in f: 

668 if '<sect1' in line: 

669 break 

670 if '<entry><type>' not in line: 

671 continue 

672 

673 # Parse a string such as 

674 # time [ (<replaceable>p</replaceable>) ] [ without time zone ] 

675 # into types "time" and "without time zone" 

676 

677 # remove all the tags 

678 line = re.sub("<replaceable>[^<]+</replaceable>", "", line) 

679 line = re.sub("<[^>]+>", "", line) 

680 

681 # Drop the parts containing braces 

682 for tmp in [t for tmp in line.split('[') 

683 for t in tmp.split(']') if "(" not in t]: 

684 for t in tmp.split(','): 

685 t = t.strip() 

686 if not t: 

687 continue 

688 dt.add(" ".join(t.split())) 

689 

690 dt = list(dt) 

691 dt.sort() 

692 return dt 

693 

694 def parse_pseudos(f): 

695 dt = [] 

696 re_start = re.compile(r'\s*<table id="datatype-pseudotypes-table">') 

697 re_entry = re.compile(r'\s*<entry><type>(.+?)</type></entry>') 

698 re_end = re.compile(r'\s*</table>') 

699 

700 f = iter(f) 

701 for line in f: 

702 if re_start.match(line) is not None: 

703 break 

704 else: 

705 raise ValueError('pseudo datatypes table not found') 

706 

707 for line in f: 

708 m = re_entry.match(line) 

709 if m is not None: 

710 dt.append(m.group(1)) 

711 

712 if re_end.match(line) is not None: 

713 break 

714 else: 

715 raise ValueError('end of pseudo datatypes table not found') 

716 

717 if not dt: 

718 raise ValueError('pseudo datatypes not found') 

719 

720 dt.sort() 

721 return dt 

722 

723 def update_consts(filename, constname, content): 

724 with open(filename, encoding='utf-8') as f: 

725 data = f.read() 

726 

727 # Line to start/end inserting 

728 re_match = re.compile(rf'^{constname}\s*=\s*\($.*?^\s*\)$', re.M | re.S) 

729 m = re_match.search(data) 

730 if not m: 

731 raise ValueError(f'Could not find existing definition for {constname}') 

732 

733 new_block = format_lines(constname, content) 

734 data = data[:m.start()] + new_block + data[m.end():] 

735 

736 with open(filename, 'w', encoding='utf-8', newline='\n') as f: 

737 f.write(data) 

738 

739 update_myself()