_postgres_builtins.py 11 KB

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