Hide keyboard shortcuts

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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

5 

6 Self-updating data files for PostgreSQL lexer. 

7 

8 :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS. 

9 :license: BSD, see LICENSE for details. 

10""" 

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 '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) 

467 

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) 

529 

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) 

555 

556# Remove 'trigger' from types 

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

558 

559PLPGSQL_KEYWORDS = ( 

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

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

562 'RETURN', 'REVERSE', 'SQLSTATE', 'WHILE', 

563) 

564 

565 

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 

572 

573 from pygments.util import format_lines 

574 

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' 

579 

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) 

585 

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

587 keywords = parse_keywords(content) 

588 

589 update_consts(__file__, 'DATATYPES', datatypes) 

590 update_consts(__file__, 'PSEUDO_TYPES', pseudos) 

591 update_consts(__file__, 'KEYWORDS', keywords) 

592 

593 def parse_keywords(f): 

594 kw = [] 

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

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

597 

598 if not kw: 

599 raise ValueError('no keyword found') 

600 

601 kw.sort() 

602 return kw 

603 

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 

611 

612 # Parse a string such as 

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

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

615 

616 # remove all the tags 

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

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

619 

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())) 

627 

628 dt = list(dt) 

629 dt.sort() 

630 return dt 

631 

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>') 

637 

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') 

644 

645 for line in f: 

646 m = re_entry.match(line) 

647 if m is not None: 

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

649 

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

651 break 

652 else: 

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

654 

655 if not dt: 

656 raise ValueError('pseudo datatypes not found') 

657 

658 dt.sort() 

659 return dt 

660 

661 def update_consts(filename, constname, content): 

662 with open(filename) as f: 

663 data = f.read() 

664 

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,)) 

671 

672 new_block = format_lines(constname, content) 

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

674 

675 with open(filename, 'w', newline='\n') as f: 

676 f.write(data) 

677 

678 update_myself()