neonctl 2.22.2 → 2.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +84 -0
  2. package/analytics.js +5 -2
  3. package/commands/branches.js +9 -1
  4. package/commands/connection_string.js +9 -1
  5. package/commands/functions.js +277 -0
  6. package/commands/index.js +4 -0
  7. package/commands/neon_auth.js +1013 -0
  8. package/commands/projects.js +9 -1
  9. package/commands/psql.js +6 -1
  10. package/functions_api.js +44 -0
  11. package/package.json +15 -5
  12. package/psql/cli.js +51 -0
  13. package/psql/command/cmd_cond.js +437 -0
  14. package/psql/command/cmd_connect.js +815 -0
  15. package/psql/command/cmd_copy.js +1025 -0
  16. package/psql/command/cmd_describe.js +1810 -0
  17. package/psql/command/cmd_format.js +909 -0
  18. package/psql/command/cmd_io.js +2187 -0
  19. package/psql/command/cmd_lo.js +385 -0
  20. package/psql/command/cmd_meta.js +970 -0
  21. package/psql/command/cmd_misc.js +187 -0
  22. package/psql/command/cmd_pipeline.js +1141 -0
  23. package/psql/command/cmd_restrict.js +171 -0
  24. package/psql/command/cmd_show.js +751 -0
  25. package/psql/command/dispatch.js +343 -0
  26. package/psql/command/inputQueue.js +42 -0
  27. package/psql/command/shared.js +71 -0
  28. package/psql/complete/filenames.js +139 -0
  29. package/psql/complete/index.js +104 -0
  30. package/psql/complete/matcher.js +314 -0
  31. package/psql/complete/psqlVars.js +247 -0
  32. package/psql/complete/queries.js +491 -0
  33. package/psql/complete/rules.js +2387 -0
  34. package/psql/core/common.js +1250 -0
  35. package/psql/core/help.js +576 -0
  36. package/psql/core/mainloop.js +1353 -0
  37. package/psql/core/prompt.js +437 -0
  38. package/psql/core/settings.js +684 -0
  39. package/psql/core/sqlHelp.js +1066 -0
  40. package/psql/core/startup.js +840 -0
  41. package/psql/core/syncVars.js +116 -0
  42. package/psql/core/variables.js +287 -0
  43. package/psql/describe/formatters.js +1277 -0
  44. package/psql/describe/processNamePattern.js +270 -0
  45. package/psql/describe/queries.js +2373 -0
  46. package/psql/describe/versionGate.js +43 -0
  47. package/psql/index.js +2005 -0
  48. package/psql/io/history.js +299 -0
  49. package/psql/io/input.js +120 -0
  50. package/psql/io/lineEditor/buffer.js +323 -0
  51. package/psql/io/lineEditor/complete.js +227 -0
  52. package/psql/io/lineEditor/filename.js +159 -0
  53. package/psql/io/lineEditor/index.js +891 -0
  54. package/psql/io/lineEditor/keymap.js +738 -0
  55. package/psql/io/lineEditor/vt100.js +363 -0
  56. package/psql/io/pgpass.js +202 -0
  57. package/psql/io/pgservice.js +194 -0
  58. package/psql/io/psqlrc.js +422 -0
  59. package/psql/print/aligned.js +1756 -0
  60. package/psql/print/asciidoc.js +248 -0
  61. package/psql/print/crosstab.js +460 -0
  62. package/psql/print/csv.js +92 -0
  63. package/psql/print/html.js +258 -0
  64. package/psql/print/json.js +96 -0
  65. package/psql/print/latex.js +396 -0
  66. package/psql/print/pager.js +265 -0
  67. package/psql/print/troff.js +258 -0
  68. package/psql/print/unaligned.js +118 -0
  69. package/psql/print/units.js +135 -0
  70. package/psql/scanner/slash.js +513 -0
  71. package/psql/scanner/sql.js +910 -0
  72. package/psql/scanner/stringutils.js +390 -0
  73. package/psql/types/backslash.js +1 -0
  74. package/psql/types/connection.js +1 -0
  75. package/psql/types/index.js +7 -0
  76. package/psql/types/printer.js +1 -0
  77. package/psql/types/repl.js +1 -0
  78. package/psql/types/scanner.js +24 -0
  79. package/psql/types/settings.js +1 -0
  80. package/psql/types/variables.js +1 -0
  81. package/psql/wire/connection.js +2844 -0
  82. package/psql/wire/copy.js +108 -0
  83. package/psql/wire/notify.js +59 -0
  84. package/psql/wire/pipeline.js +519 -0
  85. package/psql/wire/protocol.js +466 -0
  86. package/psql/wire/sasl.js +296 -0
  87. package/psql/wire/tls.js +596 -0
  88. package/test_utils/fixtures.js +1 -0
  89. package/utils/esbuild.js +147 -0
  90. package/utils/psql.js +107 -11
  91. package/utils/zip.js +4 -0
  92. package/writer.js +1 -1
  93. package/commands/auth.test.js +0 -211
  94. package/commands/branches.test.js +0 -460
  95. package/commands/checkout.test.js +0 -170
  96. package/commands/connection_string.test.js +0 -196
  97. package/commands/data_api.test.js +0 -169
  98. package/commands/databases.test.js +0 -39
  99. package/commands/help.test.js +0 -9
  100. package/commands/init.test.js +0 -56
  101. package/commands/ip_allow.test.js +0 -59
  102. package/commands/link.test.js +0 -381
  103. package/commands/operations.test.js +0 -7
  104. package/commands/orgs.test.js +0 -7
  105. package/commands/projects.test.js +0 -144
  106. package/commands/psql.test.js +0 -49
  107. package/commands/roles.test.js +0 -37
  108. package/commands/set_context.test.js +0 -159
  109. package/commands/vpc_endpoints.test.js +0 -69
  110. package/context.test.js +0 -119
  111. package/env.test.js +0 -55
  112. package/utils/formats.test.js +0 -32
  113. package/writer.test.js +0 -104
@@ -0,0 +1,1066 @@
1
+ /**
2
+ * SQL command help data for `\h` (helpSQL).
3
+ *
4
+ * This is a minimum-viable subset of upstream PostgreSQL's `sql_help.h`, which
5
+ * is auto-generated from the SGML documentation at psql build time and covers
6
+ * roughly 600 commands. Here we ship concise syntax skeletons for the ~70 SQL
7
+ * commands that account for the vast majority of interactive `\h` lookups.
8
+ * Each entry mirrors the shape of upstream `\h` output:
9
+ *
10
+ * Command: <cmd>
11
+ * Description: <one-line description>
12
+ * Syntax:
13
+ * <multi-line synopsis>
14
+ *
15
+ * URL: <docs page>
16
+ *
17
+ * Drill-down on rarer commands is delegated to the URL — accuracy on the
18
+ * skeleton is what matters here; the docs page is the source of truth for
19
+ * details like reloption catalogs and per-storage-engine quirks.
20
+ */
21
+ const PG_DOCS = 'https://www.postgresql.org/docs/current/sql-';
22
+ export const SQL_HELP = [
23
+ // ---------------------------------------------------------------------------
24
+ // DML
25
+ // ---------------------------------------------------------------------------
26
+ {
27
+ cmd: 'SELECT',
28
+ description: 'retrieve rows from a table or view',
29
+ syntax: `[ WITH [ RECURSIVE ] with_query [, ...] ]
30
+ SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
31
+ [ * | expression [ [ AS ] output_name ] [, ...] ]
32
+ [ FROM from_item [, ...] ]
33
+ [ WHERE condition ]
34
+ [ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
35
+ [ HAVING condition ]
36
+ [ WINDOW window_name AS ( window_definition ) [, ...] ]
37
+ [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
38
+ [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
39
+ [ LIMIT { count | ALL } ]
40
+ [ OFFSET start [ ROW | ROWS ] ]
41
+ [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF from_reference [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]`,
42
+ docUrl: `${PG_DOCS}select.html`,
43
+ },
44
+ {
45
+ cmd: 'INSERT',
46
+ description: 'create new rows in a table',
47
+ syntax: `[ WITH [ RECURSIVE ] with_query [, ...] ]
48
+ INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ]
49
+ [ OVERRIDING { SYSTEM | USER } VALUE ]
50
+ { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
51
+ [ ON CONFLICT [ conflict_target ] conflict_action ]
52
+ [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ]
53
+
54
+ where conflict_action is one of:
55
+ DO NOTHING
56
+ DO UPDATE SET { column_name = { expression | DEFAULT } |
57
+ ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
58
+ [ WHERE condition ]`,
59
+ docUrl: `${PG_DOCS}insert.html`,
60
+ },
61
+ {
62
+ cmd: 'UPDATE',
63
+ description: 'update rows of a table',
64
+ syntax: `[ WITH [ RECURSIVE ] with_query [, ...] ]
65
+ UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ]
66
+ SET { column_name = { expression | DEFAULT } |
67
+ ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
68
+ ( column_name [, ...] ) = ( sub-SELECT )
69
+ } [, ...]
70
+ [ FROM from_item [, ...] ]
71
+ [ WHERE condition | WHERE CURRENT OF cursor_name ]
72
+ [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ]`,
73
+ docUrl: `${PG_DOCS}update.html`,
74
+ },
75
+ {
76
+ cmd: 'DELETE',
77
+ description: 'delete rows of a table',
78
+ syntax: `[ WITH [ RECURSIVE ] with_query [, ...] ]
79
+ DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
80
+ [ USING from_item [, ...] ]
81
+ [ WHERE condition | WHERE CURRENT OF cursor_name ]
82
+ [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ]`,
83
+ docUrl: `${PG_DOCS}delete.html`,
84
+ },
85
+ {
86
+ cmd: 'MERGE',
87
+ description: 'conditionally insert, update, or delete rows of a table',
88
+ syntax: `[ WITH with_query [, ...] ]
89
+ MERGE INTO [ ONLY ] target_table_name [ * ] [ [ AS ] target_alias ]
90
+ USING data_source ON join_condition
91
+ when_clause [...]
92
+ [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ]
93
+
94
+ where when_clause is one of:
95
+ WHEN MATCHED [ AND condition ] THEN { merge_update | merge_delete | DO NOTHING }
96
+ WHEN NOT MATCHED BY SOURCE [ AND condition ] THEN { merge_update | merge_delete | DO NOTHING }
97
+ WHEN NOT MATCHED [ BY TARGET ] [ AND condition ] THEN { merge_insert | DO NOTHING }`,
98
+ docUrl: `${PG_DOCS}merge.html`,
99
+ },
100
+ {
101
+ cmd: 'COPY',
102
+ description: 'copy data between a file and a table',
103
+ syntax: `COPY table_name [ ( column_name [, ...] ) ]
104
+ FROM { 'filename' | PROGRAM 'command' | STDIN }
105
+ [ [ WITH ] ( option [, ...] ) ]
106
+ [ WHERE condition ]
107
+
108
+ COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
109
+ TO { 'filename' | PROGRAM 'command' | STDOUT }
110
+ [ [ WITH ] ( option [, ...] ) ]`,
111
+ docUrl: `${PG_DOCS}copy.html`,
112
+ },
113
+ {
114
+ cmd: 'EXPLAIN',
115
+ description: 'show the execution plan of a statement',
116
+ syntax: `EXPLAIN [ ( option [, ...] ) ] statement
117
+ EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
118
+
119
+ where option can be one of:
120
+ ANALYZE [ boolean ]
121
+ VERBOSE [ boolean ]
122
+ COSTS [ boolean ]
123
+ SETTINGS [ boolean ]
124
+ GENERIC_PLAN [ boolean ]
125
+ BUFFERS [ boolean ]
126
+ SERIALIZE [ { NONE | TEXT | BINARY } ]
127
+ WAL [ boolean ]
128
+ TIMING [ boolean ]
129
+ SUMMARY [ boolean ]
130
+ MEMORY [ boolean ]
131
+ FORMAT { TEXT | XML | JSON | YAML }`,
132
+ docUrl: `${PG_DOCS}explain.html`,
133
+ },
134
+ {
135
+ cmd: 'ANALYZE',
136
+ description: 'collect statistics about a database',
137
+ syntax: `ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
138
+ ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]
139
+
140
+ where option can be one of:
141
+ VERBOSE [ boolean ]
142
+ SKIP_LOCKED [ boolean ]
143
+ BUFFER_USAGE_LIMIT size
144
+
145
+ and table_and_columns is:
146
+ table_name [ ( column_name [, ...] ) ]`,
147
+ docUrl: `${PG_DOCS}analyze.html`,
148
+ },
149
+ {
150
+ cmd: 'VACUUM',
151
+ description: 'garbage-collect and optionally analyze a database',
152
+ syntax: `VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
153
+ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]
154
+
155
+ where option can be one of:
156
+ FULL [ boolean ]
157
+ FREEZE [ boolean ]
158
+ VERBOSE [ boolean ]
159
+ ANALYZE [ boolean ]
160
+ DISABLE_PAGE_SKIPPING [ boolean ]
161
+ SKIP_LOCKED [ boolean ]
162
+ INDEX_CLEANUP { AUTO | ON | OFF }
163
+ PROCESS_TOAST [ boolean ]
164
+ TRUNCATE [ boolean ]
165
+ PARALLEL integer
166
+ SKIP_DATABASE_STATS [ boolean ]
167
+ ONLY_DATABASE_STATS [ boolean ]
168
+ BUFFER_USAGE_LIMIT size`,
169
+ docUrl: `${PG_DOCS}vacuum.html`,
170
+ },
171
+ {
172
+ cmd: 'REINDEX',
173
+ description: 'rebuild indexes',
174
+ syntax: `REINDEX [ ( option [, ...] ) ] { INDEX | TABLE | SCHEMA } [ CONCURRENTLY ] name
175
+ REINDEX [ ( option [, ...] ) ] { DATABASE | SYSTEM } [ CONCURRENTLY ] [ name ]
176
+
177
+ where option can be one of:
178
+ CONCURRENTLY [ boolean ]
179
+ TABLESPACE new_tablespace
180
+ VERBOSE [ boolean ]`,
181
+ docUrl: `${PG_DOCS}reindex.html`,
182
+ },
183
+ {
184
+ cmd: 'TRUNCATE',
185
+ description: 'empty a table or set of tables',
186
+ syntax: `TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
187
+ [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]`,
188
+ docUrl: `${PG_DOCS}truncate.html`,
189
+ },
190
+ // ---------------------------------------------------------------------------
191
+ // CREATE
192
+ // ---------------------------------------------------------------------------
193
+ {
194
+ cmd: 'CREATE TABLE',
195
+ description: 'define a new table',
196
+ syntax: `CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
197
+ { column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ COMPRESSION compression_method ] [ COLLATE collation ] [ column_constraint [ ... ] ]
198
+ | table_constraint
199
+ | LIKE source_table [ like_option ... ] }
200
+ [, ... ]
201
+ ] )
202
+ [ INHERITS ( parent_table [, ... ] ) ]
203
+ [ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
204
+ [ USING method ]
205
+ [ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
206
+ [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
207
+ [ TABLESPACE tablespace_name ]
208
+
209
+ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
210
+ OF type_name [ ( { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ] | table_constraint } [, ... ] ) ] [...]
211
+
212
+ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
213
+ PARTITION OF parent_table [ ( ... ) ] { FOR VALUES partition_bound_spec | DEFAULT } [...]`,
214
+ docUrl: `${PG_DOCS}createtable.html`,
215
+ },
216
+ {
217
+ cmd: 'CREATE INDEX',
218
+ description: 'define a new index',
219
+ syntax: `CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON [ ONLY ] table_name [ USING method ]
220
+ ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
221
+ [ INCLUDE ( column_name [, ...] ) ]
222
+ [ NULLS [ NOT ] DISTINCT ]
223
+ [ WITH ( storage_parameter [= value] [, ... ] ) ]
224
+ [ TABLESPACE tablespace_name ]
225
+ [ WHERE predicate ]`,
226
+ docUrl: `${PG_DOCS}createindex.html`,
227
+ },
228
+ {
229
+ cmd: 'CREATE VIEW',
230
+ description: 'define a new view',
231
+ syntax: `CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ]
232
+ [ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
233
+ AS query
234
+ [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]`,
235
+ docUrl: `${PG_DOCS}createview.html`,
236
+ },
237
+ {
238
+ cmd: 'CREATE MATERIALIZED VIEW',
239
+ description: 'define a new materialized view',
240
+ syntax: `CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] table_name
241
+ [ (column_name [, ...] ) ]
242
+ [ USING method ]
243
+ [ WITH ( storage_parameter [= value] [, ... ] ) ]
244
+ [ TABLESPACE tablespace_name ]
245
+ AS query
246
+ [ WITH [ NO ] DATA ]`,
247
+ docUrl: `${PG_DOCS}creatematerializedview.html`,
248
+ },
249
+ {
250
+ cmd: 'CREATE FUNCTION',
251
+ description: 'define a new function',
252
+ syntax: `CREATE [ OR REPLACE ] FUNCTION
253
+ name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
254
+ [ RETURNS rettype
255
+ | RETURNS TABLE ( column_name column_type [, ...] ) ]
256
+ { LANGUAGE lang_name
257
+ | TRANSFORM { FOR TYPE type_name } [, ... ]
258
+ | WINDOW
259
+ | { IMMUTABLE | STABLE | VOLATILE }
260
+ | [ NOT ] LEAKPROOF
261
+ | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
262
+ | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }
263
+ | PARALLEL { UNSAFE | RESTRICTED | SAFE }
264
+ | COST execution_cost
265
+ | ROWS result_rows
266
+ | SUPPORT support_function
267
+ | SET configuration_parameter { TO value | = value | FROM CURRENT }
268
+ | AS 'definition'
269
+ | AS 'obj_file', 'link_symbol'
270
+ | sql_body
271
+ } ...`,
272
+ docUrl: `${PG_DOCS}createfunction.html`,
273
+ },
274
+ {
275
+ cmd: 'CREATE PROCEDURE',
276
+ description: 'define a new procedure',
277
+ syntax: `CREATE [ OR REPLACE ] PROCEDURE
278
+ name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
279
+ { LANGUAGE lang_name
280
+ | TRANSFORM { FOR TYPE type_name } [, ... ]
281
+ | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
282
+ | SET configuration_parameter { TO value | = value | FROM CURRENT }
283
+ | AS 'definition'
284
+ | AS 'obj_file', 'link_symbol'
285
+ | sql_body
286
+ } ...`,
287
+ docUrl: `${PG_DOCS}createprocedure.html`,
288
+ },
289
+ {
290
+ cmd: 'CREATE EXTENSION',
291
+ description: 'install an extension',
292
+ syntax: `CREATE EXTENSION [ IF NOT EXISTS ] extension_name
293
+ [ WITH ] [ SCHEMA schema_name ]
294
+ [ VERSION version ]
295
+ [ CASCADE ]`,
296
+ docUrl: `${PG_DOCS}createextension.html`,
297
+ },
298
+ {
299
+ cmd: 'CREATE SCHEMA',
300
+ description: 'define a new schema',
301
+ syntax: `CREATE SCHEMA [ IF NOT EXISTS ] schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]
302
+ CREATE SCHEMA [ IF NOT EXISTS ] AUTHORIZATION role_specification [ schema_element [ ... ] ]
303
+
304
+ where role_specification can be:
305
+ user_name
306
+ | CURRENT_ROLE
307
+ | CURRENT_USER
308
+ | SESSION_USER`,
309
+ docUrl: `${PG_DOCS}createschema.html`,
310
+ },
311
+ {
312
+ cmd: 'CREATE DATABASE',
313
+ description: 'create a new database',
314
+ syntax: `CREATE DATABASE name
315
+ [ WITH ] [ OWNER [=] user_name ]
316
+ [ TEMPLATE [=] template ]
317
+ [ ENCODING [=] encoding ]
318
+ [ STRATEGY [=] strategy ]
319
+ [ LOCALE [=] locale ]
320
+ [ LC_COLLATE [=] lc_collate ]
321
+ [ LC_CTYPE [=] lc_ctype ]
322
+ [ BUILTIN_LOCALE [=] builtin_locale ]
323
+ [ ICU_LOCALE [=] icu_locale ]
324
+ [ ICU_RULES [=] icu_rules ]
325
+ [ LOCALE_PROVIDER [=] locale_provider ]
326
+ [ COLLATION_VERSION = collation_version ]
327
+ [ TABLESPACE [=] tablespace_name ]
328
+ [ ALLOW_CONNECTIONS [=] allowconn ]
329
+ [ CONNECTION LIMIT [=] connlimit ]
330
+ [ IS_TEMPLATE [=] istemplate ]
331
+ [ OID [=] oid ]`,
332
+ docUrl: `${PG_DOCS}createdatabase.html`,
333
+ },
334
+ {
335
+ cmd: 'CREATE ROLE',
336
+ description: 'define a new database role',
337
+ syntax: `CREATE ROLE name [ [ WITH ] option [ ... ] ]
338
+
339
+ where option can be:
340
+
341
+ SUPERUSER | NOSUPERUSER
342
+ | CREATEDB | NOCREATEDB
343
+ | CREATEROLE | NOCREATEROLE
344
+ | INHERIT | NOINHERIT
345
+ | LOGIN | NOLOGIN
346
+ | REPLICATION | NOREPLICATION
347
+ | BYPASSRLS | NOBYPASSRLS
348
+ | CONNECTION LIMIT connlimit
349
+ | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
350
+ | VALID UNTIL 'timestamp'
351
+ | IN ROLE role_name [, ...]
352
+ | ROLE role_name [, ...]
353
+ | ADMIN role_name [, ...]
354
+ | SYSID uid`,
355
+ docUrl: `${PG_DOCS}createrole.html`,
356
+ },
357
+ {
358
+ cmd: 'CREATE USER',
359
+ description: 'define a new database role (alias for CREATE ROLE ... LOGIN)',
360
+ syntax: `CREATE USER name [ [ WITH ] option [ ... ] ]
361
+
362
+ where option can be:
363
+
364
+ SUPERUSER | NOSUPERUSER
365
+ | CREATEDB | NOCREATEDB
366
+ | CREATEROLE | NOCREATEROLE
367
+ | INHERIT | NOINHERIT
368
+ | LOGIN | NOLOGIN
369
+ | REPLICATION | NOREPLICATION
370
+ | BYPASSRLS | NOBYPASSRLS
371
+ | CONNECTION LIMIT connlimit
372
+ | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
373
+ | VALID UNTIL 'timestamp'
374
+ | IN ROLE role_name [, ...]
375
+ | ROLE role_name [, ...]
376
+ | ADMIN role_name [, ...]`,
377
+ docUrl: `${PG_DOCS}createuser.html`,
378
+ },
379
+ {
380
+ cmd: 'CREATE TYPE',
381
+ description: 'define a new data type',
382
+ syntax: `CREATE TYPE name AS
383
+ ( [ attribute_name data_type [ COLLATE collation ] [, ... ] ] )
384
+
385
+ CREATE TYPE name AS ENUM
386
+ ( [ 'label' [, ... ] ] )
387
+
388
+ CREATE TYPE name AS RANGE (
389
+ SUBTYPE = subtype
390
+ [ , SUBTYPE_OPCLASS = subtype_operator_class ]
391
+ [ , COLLATION = collation ]
392
+ [ , CANONICAL = canonical_function ]
393
+ [ , SUBTYPE_DIFF = subtype_diff_function ]
394
+ [ , MULTIRANGE_TYPE_NAME = multirange_type_name ]
395
+ )
396
+
397
+ CREATE TYPE name (
398
+ INPUT = input_function,
399
+ OUTPUT = output_function
400
+ [ , RECEIVE = receive_function ]
401
+ [ , SEND = send_function ]
402
+ [ , ... ]
403
+ )
404
+
405
+ CREATE TYPE name`,
406
+ docUrl: `${PG_DOCS}createtype.html`,
407
+ },
408
+ {
409
+ cmd: 'CREATE TRIGGER',
410
+ description: 'define a new trigger',
411
+ syntax: `CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
412
+ ON table_name
413
+ [ FROM referenced_table_name ]
414
+ [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
415
+ [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
416
+ [ FOR [ EACH ] { ROW | STATEMENT } ]
417
+ [ WHEN ( condition ) ]
418
+ EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )
419
+
420
+ where event can be one of:
421
+ INSERT
422
+ UPDATE [ OF column_name [, ... ] ]
423
+ DELETE
424
+ TRUNCATE`,
425
+ docUrl: `${PG_DOCS}createtrigger.html`,
426
+ },
427
+ {
428
+ cmd: 'CREATE POLICY',
429
+ description: 'define a new row-level security policy for a table',
430
+ syntax: `CREATE POLICY name ON table_name
431
+ [ AS { PERMISSIVE | RESTRICTIVE } ]
432
+ [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
433
+ [ TO { role_name | PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] ]
434
+ [ USING ( using_expression ) ]
435
+ [ WITH CHECK ( check_expression ) ]`,
436
+ docUrl: `${PG_DOCS}createpolicy.html`,
437
+ },
438
+ {
439
+ cmd: 'CREATE PUBLICATION',
440
+ description: 'define a new publication',
441
+ syntax: `CREATE PUBLICATION name
442
+ [ FOR ALL TABLES
443
+ | FOR publication_object [, ... ] ]
444
+ [ WITH ( publication_parameter [= value] [, ... ] ) ]
445
+
446
+ where publication_object is one of:
447
+
448
+ TABLE [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] [, ... ]
449
+ TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]`,
450
+ docUrl: `${PG_DOCS}createpublication.html`,
451
+ },
452
+ {
453
+ cmd: 'CREATE SUBSCRIPTION',
454
+ description: 'define a new subscription',
455
+ syntax: `CREATE SUBSCRIPTION subscription_name
456
+ CONNECTION 'conninfo'
457
+ PUBLICATION publication_name [, ...]
458
+ [ WITH ( subscription_parameter [= value] [, ... ] ) ]`,
459
+ docUrl: `${PG_DOCS}createsubscription.html`,
460
+ },
461
+ // ---------------------------------------------------------------------------
462
+ // ALTER
463
+ // ---------------------------------------------------------------------------
464
+ {
465
+ cmd: 'ALTER TABLE',
466
+ description: 'change the definition of a table',
467
+ syntax: `ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
468
+ action [, ... ]
469
+ ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
470
+ RENAME [ COLUMN ] column_name TO new_column_name
471
+ ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
472
+ RENAME CONSTRAINT constraint_name TO new_constraint_name
473
+ ALTER TABLE [ IF EXISTS ] name
474
+ RENAME TO new_name
475
+ ALTER TABLE [ IF EXISTS ] name
476
+ SET SCHEMA new_schema
477
+ ALTER TABLE ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
478
+ SET TABLESPACE new_tablespace [ NOWAIT ]
479
+ ALTER TABLE [ IF EXISTS ] name
480
+ ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }
481
+ ALTER TABLE [ IF EXISTS ] name
482
+ DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ]
483
+
484
+ where action is one of:
485
+ ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
486
+ DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
487
+ ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]
488
+ ALTER [ COLUMN ] column_name SET DEFAULT expression
489
+ ALTER [ COLUMN ] column_name DROP DEFAULT
490
+ ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
491
+ ADD table_constraint [ NOT VALID ]
492
+ DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]
493
+ ENABLE | DISABLE ROW LEVEL SECURITY
494
+ OWNER TO new_owner
495
+ SET TABLESPACE new_tablespace`,
496
+ docUrl: `${PG_DOCS}altertable.html`,
497
+ },
498
+ {
499
+ cmd: 'ALTER INDEX',
500
+ description: 'change the definition of an index',
501
+ syntax: `ALTER INDEX [ IF EXISTS ] name RENAME TO new_name
502
+ ALTER INDEX [ IF EXISTS ] name SET TABLESPACE tablespace_name
503
+ ALTER INDEX name ATTACH PARTITION index_name
504
+ ALTER INDEX name [ NO ] DEPENDS ON EXTENSION extension_name
505
+ ALTER INDEX [ IF EXISTS ] name SET ( storage_parameter [= value] [, ... ] )
506
+ ALTER INDEX [ IF EXISTS ] name RESET ( storage_parameter [, ... ] )
507
+ ALTER INDEX [ IF EXISTS ] name ALTER [ COLUMN ] column_number
508
+ SET STATISTICS integer
509
+ ALTER INDEX ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
510
+ SET TABLESPACE new_tablespace [ NOWAIT ]`,
511
+ docUrl: `${PG_DOCS}alterindex.html`,
512
+ },
513
+ {
514
+ cmd: 'ALTER VIEW',
515
+ description: 'change the definition of a view',
516
+ syntax: `ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression
517
+ ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name DROP DEFAULT
518
+ ALTER VIEW [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
519
+ ALTER VIEW [ IF EXISTS ] name RENAME [ COLUMN ] column_name TO new_column_name
520
+ ALTER VIEW [ IF EXISTS ] name RENAME TO new_name
521
+ ALTER VIEW [ IF EXISTS ] name SET SCHEMA new_schema
522
+ ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] )
523
+ ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] )`,
524
+ docUrl: `${PG_DOCS}alterview.html`,
525
+ },
526
+ {
527
+ cmd: 'ALTER MATERIALIZED VIEW',
528
+ description: 'change the definition of a materialized view',
529
+ syntax: `ALTER MATERIALIZED VIEW [ IF EXISTS ] name action [, ... ]
530
+ ALTER MATERIALIZED VIEW name
531
+ [ NO ] DEPENDS ON EXTENSION extension_name
532
+ ALTER MATERIALIZED VIEW [ IF EXISTS ] name
533
+ RENAME [ COLUMN ] column_name TO new_column_name
534
+ ALTER MATERIALIZED VIEW [ IF EXISTS ] name RENAME TO new_name
535
+ ALTER MATERIALIZED VIEW [ IF EXISTS ] name SET SCHEMA new_schema
536
+ ALTER MATERIALIZED VIEW ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
537
+ SET TABLESPACE new_tablespace [ NOWAIT ]`,
538
+ docUrl: `${PG_DOCS}altermaterializedview.html`,
539
+ },
540
+ {
541
+ cmd: 'ALTER FUNCTION',
542
+ description: 'change the definition of a function',
543
+ syntax: `ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
544
+ action [ ... ] [ RESTRICT ]
545
+ ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
546
+ RENAME TO new_name
547
+ ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
548
+ OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
549
+ ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
550
+ SET SCHEMA new_schema
551
+ ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
552
+ [ NO ] DEPENDS ON EXTENSION extension_name`,
553
+ docUrl: `${PG_DOCS}alterfunction.html`,
554
+ },
555
+ {
556
+ cmd: 'ALTER EXTENSION',
557
+ description: 'change the definition of an extension',
558
+ syntax: `ALTER EXTENSION name UPDATE [ TO new_version ]
559
+ ALTER EXTENSION name SET SCHEMA new_schema
560
+ ALTER EXTENSION name ADD member_object
561
+ ALTER EXTENSION name DROP member_object
562
+
563
+ where member_object is one of:
564
+ ACCESS METHOD object_name |
565
+ AGGREGATE aggregate_name ( aggregate_signature ) |
566
+ CAST (source_type AS target_type) |
567
+ COLLATION object_name |
568
+ DOMAIN object_name |
569
+ FUNCTION function_name [ ( ... ) ] |
570
+ OPERATOR operator_name (left_type, right_type) |
571
+ SCHEMA object_name |
572
+ SEQUENCE object_name |
573
+ TABLE object_name |
574
+ TYPE object_name |
575
+ VIEW object_name`,
576
+ docUrl: `${PG_DOCS}alterextension.html`,
577
+ },
578
+ {
579
+ cmd: 'ALTER SCHEMA',
580
+ description: 'change the definition of a schema',
581
+ syntax: `ALTER SCHEMA name RENAME TO new_name
582
+ ALTER SCHEMA name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }`,
583
+ docUrl: `${PG_DOCS}alterschema.html`,
584
+ },
585
+ {
586
+ cmd: 'ALTER DATABASE',
587
+ description: 'change a database',
588
+ syntax: `ALTER DATABASE name [ [ WITH ] option [ ... ] ]
589
+
590
+ where option can be:
591
+
592
+ ALLOW_CONNECTIONS allowconn
593
+ CONNECTION LIMIT connlimit
594
+ IS_TEMPLATE istemplate
595
+
596
+ ALTER DATABASE name RENAME TO new_name
597
+ ALTER DATABASE name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
598
+ ALTER DATABASE name SET TABLESPACE new_tablespace
599
+ ALTER DATABASE name REFRESH COLLATION VERSION
600
+ ALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }
601
+ ALTER DATABASE name SET configuration_parameter FROM CURRENT
602
+ ALTER DATABASE name RESET configuration_parameter
603
+ ALTER DATABASE name RESET ALL`,
604
+ docUrl: `${PG_DOCS}alterdatabase.html`,
605
+ },
606
+ {
607
+ cmd: 'ALTER ROLE',
608
+ description: 'change a database role',
609
+ syntax: `ALTER ROLE role_specification [ WITH ] option [ ... ]
610
+
611
+ where option can be:
612
+
613
+ SUPERUSER | NOSUPERUSER
614
+ | CREATEDB | NOCREATEDB
615
+ | CREATEROLE | NOCREATEROLE
616
+ | INHERIT | NOINHERIT
617
+ | LOGIN | NOLOGIN
618
+ | REPLICATION | NOREPLICATION
619
+ | BYPASSRLS | NOBYPASSRLS
620
+ | CONNECTION LIMIT connlimit
621
+ | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
622
+ | VALID UNTIL 'timestamp'
623
+
624
+ ALTER ROLE name RENAME TO new_name
625
+ ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter { TO | = } { value | DEFAULT }
626
+ ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter FROM CURRENT
627
+ ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET configuration_parameter
628
+ ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET ALL`,
629
+ docUrl: `${PG_DOCS}alterrole.html`,
630
+ },
631
+ {
632
+ cmd: 'ALTER USER',
633
+ description: 'change a database role (alias for ALTER ROLE)',
634
+ syntax: `ALTER USER role_specification [ WITH ] option [ ... ]
635
+
636
+ where option can be:
637
+
638
+ SUPERUSER | NOSUPERUSER
639
+ | CREATEDB | NOCREATEDB
640
+ | CREATEROLE | NOCREATEROLE
641
+ | INHERIT | NOINHERIT
642
+ | LOGIN | NOLOGIN
643
+ | REPLICATION | NOREPLICATION
644
+ | BYPASSRLS | NOBYPASSRLS
645
+ | CONNECTION LIMIT connlimit
646
+ | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
647
+ | VALID UNTIL 'timestamp'
648
+
649
+ ALTER USER name RENAME TO new_name`,
650
+ docUrl: `${PG_DOCS}alteruser.html`,
651
+ },
652
+ {
653
+ cmd: 'ALTER TYPE',
654
+ description: 'change the definition of a type',
655
+ syntax: `ALTER TYPE name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
656
+ ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
657
+ ALTER TYPE name RENAME TO new_name
658
+ ALTER TYPE name SET SCHEMA new_schema
659
+ ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ]
660
+ ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
661
+ ALTER TYPE name SET ( property = value [, ... ] )
662
+
663
+ where action is one of:
664
+ ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
665
+ DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ]
666
+ ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]`,
667
+ docUrl: `${PG_DOCS}altertype.html`,
668
+ },
669
+ {
670
+ cmd: 'ALTER TRIGGER',
671
+ description: 'change the definition of a trigger',
672
+ syntax: `ALTER TRIGGER name ON table_name RENAME TO new_name
673
+ ALTER TRIGGER name ON table_name [ NO ] DEPENDS ON EXTENSION extension_name`,
674
+ docUrl: `${PG_DOCS}altertrigger.html`,
675
+ },
676
+ {
677
+ cmd: 'ALTER POLICY',
678
+ description: 'change the definition of a row-level security policy',
679
+ syntax: `ALTER POLICY name ON table_name RENAME TO new_name
680
+
681
+ ALTER POLICY name ON table_name
682
+ [ TO { role_name | PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] ]
683
+ [ USING ( using_expression ) ]
684
+ [ WITH CHECK ( check_expression ) ]`,
685
+ docUrl: `${PG_DOCS}alterpolicy.html`,
686
+ },
687
+ // ---------------------------------------------------------------------------
688
+ // DROP
689
+ // ---------------------------------------------------------------------------
690
+ {
691
+ cmd: 'DROP TABLE',
692
+ description: 'remove a table',
693
+ syntax: `DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]`,
694
+ docUrl: `${PG_DOCS}droptable.html`,
695
+ },
696
+ {
697
+ cmd: 'DROP INDEX',
698
+ description: 'remove an index',
699
+ syntax: `DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]`,
700
+ docUrl: `${PG_DOCS}dropindex.html`,
701
+ },
702
+ {
703
+ cmd: 'DROP VIEW',
704
+ description: 'remove a view',
705
+ syntax: `DROP VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]`,
706
+ docUrl: `${PG_DOCS}dropview.html`,
707
+ },
708
+ {
709
+ cmd: 'DROP MATERIALIZED VIEW',
710
+ description: 'remove a materialized view',
711
+ syntax: `DROP MATERIALIZED VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]`,
712
+ docUrl: `${PG_DOCS}dropmaterializedview.html`,
713
+ },
714
+ {
715
+ cmd: 'DROP FUNCTION',
716
+ description: 'remove a function',
717
+ syntax: `DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
718
+ [ CASCADE | RESTRICT ]`,
719
+ docUrl: `${PG_DOCS}dropfunction.html`,
720
+ },
721
+ {
722
+ cmd: 'DROP EXTENSION',
723
+ description: 'remove an extension',
724
+ syntax: `DROP EXTENSION [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]`,
725
+ docUrl: `${PG_DOCS}dropextension.html`,
726
+ },
727
+ {
728
+ cmd: 'DROP SCHEMA',
729
+ description: 'remove a schema',
730
+ syntax: `DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]`,
731
+ docUrl: `${PG_DOCS}dropschema.html`,
732
+ },
733
+ {
734
+ cmd: 'DROP DATABASE',
735
+ description: 'remove a database',
736
+ syntax: `DROP DATABASE [ IF EXISTS ] name [ [ WITH ] ( option [, ...] ) ]
737
+
738
+ where option can be:
739
+
740
+ FORCE`,
741
+ docUrl: `${PG_DOCS}dropdatabase.html`,
742
+ },
743
+ {
744
+ cmd: 'DROP ROLE',
745
+ description: 'remove a database role',
746
+ syntax: `DROP ROLE [ IF EXISTS ] name [, ...]`,
747
+ docUrl: `${PG_DOCS}droprole.html`,
748
+ },
749
+ // ---------------------------------------------------------------------------
750
+ // Privileges
751
+ // ---------------------------------------------------------------------------
752
+ {
753
+ cmd: 'GRANT',
754
+ description: 'define access privileges',
755
+ syntax: `GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
756
+ [, ...] | ALL [ PRIVILEGES ] }
757
+ ON { [ TABLE ] table_name [, ...]
758
+ | ALL TABLES IN SCHEMA schema_name [, ...] }
759
+ TO role_specification [, ...] [ WITH GRANT OPTION ]
760
+ [ GRANTED BY role_specification ]
761
+
762
+ GRANT { { USAGE | SELECT | UPDATE }
763
+ [, ...] | ALL [ PRIVILEGES ] }
764
+ ON { SEQUENCE sequence_name [, ...]
765
+ | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
766
+ TO role_specification [, ...] [ WITH GRANT OPTION ]
767
+
768
+ GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
769
+ ON DATABASE database_name [, ...]
770
+ TO role_specification [, ...] [ WITH GRANT OPTION ]
771
+
772
+ GRANT { EXECUTE | ALL [ PRIVILEGES ] }
773
+ ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( ... ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
774
+ TO role_specification [, ...] [ WITH GRANT OPTION ]
775
+
776
+ GRANT role_name [, ...] TO role_specification [, ...]
777
+ [ WITH { ADMIN | INHERIT | SET } { OPTION | TRUE | FALSE } ]
778
+ [ GRANTED BY role_specification ]`,
779
+ docUrl: `${PG_DOCS}grant.html`,
780
+ },
781
+ {
782
+ cmd: 'REVOKE',
783
+ description: 'remove access privileges',
784
+ syntax: `REVOKE [ GRANT OPTION FOR ]
785
+ { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
786
+ [, ...] | ALL [ PRIVILEGES ] }
787
+ ON { [ TABLE ] table_name [, ...]
788
+ | ALL TABLES IN SCHEMA schema_name [, ...] }
789
+ FROM role_specification [, ...]
790
+ [ GRANTED BY role_specification ]
791
+ [ CASCADE | RESTRICT ]
792
+
793
+ REVOKE [ ADMIN OPTION FOR ]
794
+ role_name [, ...] FROM role_specification [, ...]
795
+ [ GRANTED BY role_specification ]
796
+ [ CASCADE | RESTRICT ]`,
797
+ docUrl: `${PG_DOCS}revoke.html`,
798
+ },
799
+ // ---------------------------------------------------------------------------
800
+ // Transaction control
801
+ // ---------------------------------------------------------------------------
802
+ {
803
+ cmd: 'BEGIN',
804
+ description: 'start a transaction block',
805
+ syntax: `BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]
806
+
807
+ where transaction_mode is one of:
808
+
809
+ ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
810
+ READ WRITE | READ ONLY
811
+ [ NOT ] DEFERRABLE`,
812
+ docUrl: `${PG_DOCS}begin.html`,
813
+ },
814
+ {
815
+ cmd: 'COMMIT',
816
+ description: 'commit the current transaction',
817
+ syntax: `COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]`,
818
+ docUrl: `${PG_DOCS}commit.html`,
819
+ },
820
+ {
821
+ cmd: 'ROLLBACK',
822
+ description: 'abort the current transaction',
823
+ syntax: `ROLLBACK [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]`,
824
+ docUrl: `${PG_DOCS}rollback.html`,
825
+ },
826
+ {
827
+ cmd: 'SAVEPOINT',
828
+ description: 'define a new savepoint within the current transaction',
829
+ syntax: `SAVEPOINT savepoint_name`,
830
+ docUrl: `${PG_DOCS}savepoint.html`,
831
+ },
832
+ {
833
+ cmd: 'RELEASE SAVEPOINT',
834
+ description: 'destroy a previously defined savepoint',
835
+ syntax: `RELEASE [ SAVEPOINT ] savepoint_name`,
836
+ docUrl: `${PG_DOCS}release-savepoint.html`,
837
+ },
838
+ {
839
+ cmd: 'START TRANSACTION',
840
+ description: 'start a transaction block',
841
+ syntax: `START TRANSACTION [ transaction_mode [, ...] ]
842
+
843
+ where transaction_mode is one of:
844
+
845
+ ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
846
+ READ WRITE | READ ONLY
847
+ [ NOT ] DEFERRABLE`,
848
+ docUrl: `${PG_DOCS}start-transaction.html`,
849
+ },
850
+ // ---------------------------------------------------------------------------
851
+ // Session / runtime configuration
852
+ // ---------------------------------------------------------------------------
853
+ {
854
+ cmd: 'SET',
855
+ description: 'change a run-time parameter',
856
+ syntax: `SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }
857
+ SET [ SESSION | LOCAL ] TIME ZONE { value | 'value' | LOCAL | DEFAULT }`,
858
+ docUrl: `${PG_DOCS}set.html`,
859
+ },
860
+ {
861
+ cmd: 'SET ROLE',
862
+ description: 'set the current user identifier of the current session',
863
+ syntax: `SET [ SESSION | LOCAL ] ROLE role_name
864
+ SET [ SESSION | LOCAL ] ROLE NONE
865
+ RESET ROLE`,
866
+ docUrl: `${PG_DOCS}set-role.html`,
867
+ },
868
+ {
869
+ cmd: 'RESET',
870
+ description: 'restore the value of a run-time parameter to the default value',
871
+ syntax: `RESET configuration_parameter
872
+ RESET ALL`,
873
+ docUrl: `${PG_DOCS}reset.html`,
874
+ },
875
+ {
876
+ cmd: 'SHOW',
877
+ description: 'show the value of a run-time parameter',
878
+ syntax: `SHOW name
879
+ SHOW ALL`,
880
+ docUrl: `${PG_DOCS}show.html`,
881
+ },
882
+ // ---------------------------------------------------------------------------
883
+ // Async notification
884
+ // ---------------------------------------------------------------------------
885
+ {
886
+ cmd: 'LISTEN',
887
+ description: 'listen for a notification',
888
+ syntax: `LISTEN channel`,
889
+ docUrl: `${PG_DOCS}listen.html`,
890
+ },
891
+ {
892
+ cmd: 'NOTIFY',
893
+ description: 'generate a notification',
894
+ syntax: `NOTIFY channel [ , payload ]`,
895
+ docUrl: `${PG_DOCS}notify.html`,
896
+ },
897
+ {
898
+ cmd: 'UNLISTEN',
899
+ description: 'stop listening for a notification',
900
+ syntax: `UNLISTEN { channel | * }`,
901
+ docUrl: `${PG_DOCS}unlisten.html`,
902
+ },
903
+ // ---------------------------------------------------------------------------
904
+ // Locking
905
+ // ---------------------------------------------------------------------------
906
+ {
907
+ cmd: 'LOCK',
908
+ description: 'lock a table',
909
+ syntax: `LOCK [ TABLE ] [ ONLY ] name [ * ] [, ...] [ IN lockmode MODE ] [ NOWAIT ]
910
+
911
+ where lockmode is one of:
912
+
913
+ ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
914
+ | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE`,
915
+ docUrl: `${PG_DOCS}lock.html`,
916
+ },
917
+ // ---------------------------------------------------------------------------
918
+ // Prepared statements
919
+ // ---------------------------------------------------------------------------
920
+ {
921
+ cmd: 'PREPARE',
922
+ description: 'prepare a statement for execution',
923
+ syntax: `PREPARE name [ ( data_type [, ...] ) ] AS statement`,
924
+ docUrl: `${PG_DOCS}prepare.html`,
925
+ },
926
+ {
927
+ cmd: 'EXECUTE',
928
+ description: 'execute a prepared statement',
929
+ syntax: `EXECUTE name [ ( parameter [, ...] ) ]`,
930
+ docUrl: `${PG_DOCS}execute.html`,
931
+ },
932
+ {
933
+ cmd: 'DEALLOCATE',
934
+ description: 'deallocate a prepared statement',
935
+ syntax: `DEALLOCATE [ PREPARE ] { name | ALL }`,
936
+ docUrl: `${PG_DOCS}deallocate.html`,
937
+ },
938
+ // ---------------------------------------------------------------------------
939
+ // Cursors
940
+ // ---------------------------------------------------------------------------
941
+ {
942
+ cmd: 'DECLARE',
943
+ description: 'define a cursor',
944
+ syntax: `DECLARE name [ BINARY ] [ ASENSITIVE | INSENSITIVE ] [ [ NO ] SCROLL ]
945
+ CURSOR [ { WITH | WITHOUT } HOLD ] FOR query`,
946
+ docUrl: `${PG_DOCS}declare.html`,
947
+ },
948
+ {
949
+ cmd: 'FETCH',
950
+ description: 'retrieve rows from a query using a cursor',
951
+ syntax: `FETCH [ direction ] [ FROM | IN ] cursor_name
952
+
953
+ where direction can be empty or one of:
954
+
955
+ NEXT
956
+ PRIOR
957
+ FIRST
958
+ LAST
959
+ ABSOLUTE count
960
+ RELATIVE count
961
+ count
962
+ ALL
963
+ FORWARD
964
+ FORWARD count
965
+ FORWARD ALL
966
+ BACKWARD
967
+ BACKWARD count
968
+ BACKWARD ALL`,
969
+ docUrl: `${PG_DOCS}fetch.html`,
970
+ },
971
+ {
972
+ cmd: 'MOVE',
973
+ description: 'position a cursor',
974
+ syntax: `MOVE [ direction ] [ FROM | IN ] cursor_name
975
+
976
+ where direction can be empty or one of:
977
+
978
+ NEXT | PRIOR | FIRST | LAST
979
+ | ABSOLUTE count | RELATIVE count | count | ALL
980
+ | FORWARD | FORWARD count | FORWARD ALL
981
+ | BACKWARD | BACKWARD count | BACKWARD ALL`,
982
+ docUrl: `${PG_DOCS}move.html`,
983
+ },
984
+ {
985
+ cmd: 'CLOSE',
986
+ description: 'close a cursor',
987
+ syntax: `CLOSE { name | ALL }`,
988
+ docUrl: `${PG_DOCS}close.html`,
989
+ },
990
+ // ---------------------------------------------------------------------------
991
+ // Procedural / misc
992
+ // ---------------------------------------------------------------------------
993
+ {
994
+ cmd: 'CALL',
995
+ description: 'invoke a procedure',
996
+ syntax: `CALL name ( [ argument ] [, ...] )`,
997
+ docUrl: `${PG_DOCS}call.html`,
998
+ },
999
+ {
1000
+ cmd: 'DO',
1001
+ description: 'execute an anonymous code block',
1002
+ syntax: `DO [ LANGUAGE lang_name ] code`,
1003
+ docUrl: `${PG_DOCS}do.html`,
1004
+ },
1005
+ ];
1006
+ // ---------------------------------------------------------------------------
1007
+ // Lookup helpers.
1008
+ //
1009
+ // Upstream's matcher is case-insensitive and matches by whitespace-tokenised
1010
+ // prefix: "create t" matches CREATE TABLE, CREATE TRIGGER, CREATE TYPE; the
1011
+ // full command name is also accepted. If the input matches an entry exactly
1012
+ // (case-insensitively), we treat that as a single match even if it's a prefix
1013
+ // of others — so `\h CREATE` lists everything starting with CREATE rather
1014
+ // than failing on ambiguity (which matches the spec's "prefix match" wording).
1015
+ // We additionally accept a single trailing space.
1016
+ // ---------------------------------------------------------------------------
1017
+ /** Normalise a topic string for matching. */
1018
+ const normalize = (s) => s.trim().replace(/\s+/gu, ' ').toUpperCase();
1019
+ /** Tokenise on whitespace, dropping empties. */
1020
+ const tokens = (s) => s.split(/\s+/u).filter((t) => t.length > 0);
1021
+ /**
1022
+ * Return entries whose `cmd` matches the topic by whitespace-tokenised prefix.
1023
+ *
1024
+ * Semantics:
1025
+ * - "select" → [SELECT]
1026
+ * - "CREATE T" → all CREATE entries starting with "T" (TABLE, TRIGGER, TYPE)
1027
+ * - "CREATE" → all CREATE entries
1028
+ * - "CREATE TABLE"→ exactly [CREATE TABLE]
1029
+ *
1030
+ * Each topic token must be a prefix of the entry's token at the same index;
1031
+ * the entry must have at least as many tokens as the topic.
1032
+ */
1033
+ export const findMatches = (topic) => {
1034
+ const needle = normalize(topic);
1035
+ if (needle.length === 0)
1036
+ return [];
1037
+ const needleToks = tokens(needle);
1038
+ return SQL_HELP.filter((entry) => {
1039
+ const cmdToks = tokens(entry.cmd.toUpperCase());
1040
+ if (cmdToks.length < needleToks.length)
1041
+ return false;
1042
+ for (let i = 0; i < needleToks.length; i++) {
1043
+ if (!cmdToks[i].startsWith(needleToks[i]))
1044
+ return false;
1045
+ }
1046
+ return true;
1047
+ });
1048
+ };
1049
+ /**
1050
+ * Format a single entry the way upstream `\h` does:
1051
+ *
1052
+ * Command: CMD
1053
+ * Description: DESC
1054
+ * Syntax:
1055
+ * <syntax body>
1056
+ *
1057
+ * URL: <docs>
1058
+ */
1059
+ export const formatEntry = (entry) => {
1060
+ return (`Command: ${entry.cmd}\n` +
1061
+ `Description: ${entry.description}\n` +
1062
+ `Syntax:\n` +
1063
+ `${entry.syntax}\n` +
1064
+ `\n` +
1065
+ `URL: ${entry.docUrl}\n`);
1066
+ };