@intentius/chant-lexicon-sql 0.124.30 → 0.124.32
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.
- package/dist/change-set.js +250 -0
- package/dist/clickhouse/access.js +722 -0
- package/dist/clickhouse/apply/apply.js +243 -0
- package/dist/clickhouse/apply/mutations.js +66 -0
- package/dist/clickhouse/apply/statements.js +545 -0
- package/dist/clickhouse/catalog-types.js +7 -0
- package/dist/clickhouse/container.js +152 -0
- package/dist/clickhouse/engine-syntax.js +159 -0
- package/dist/clickhouse/entities.js +593 -0
- package/dist/clickhouse/expressions.js +107 -0
- package/dist/clickhouse/http.js +55 -0
- package/dist/clickhouse/import/generator.js +192 -0
- package/dist/clickhouse/import/inlined.js +207 -0
- package/dist/clickhouse/import/ir.js +160 -0
- package/dist/clickhouse/import/live-export.js +131 -0
- package/dist/clickhouse/import/parser.js +17 -0
- package/dist/clickhouse/live/bind.js +116 -0
- package/dist/clickhouse/live/catalog.js +223 -0
- package/dist/clickhouse/live/describe-resources.js +91 -0
- package/dist/clickhouse/live/undeclarable.js +59 -0
- package/dist/clickhouse/overlays/codecs.js +57 -0
- package/dist/clickhouse/overlays/engines.js +101 -0
- package/dist/clickhouse/overlays/kinds.js +1 -0
- package/dist/clickhouse/overlays/projections.js +26 -0
- package/dist/clickhouse/overlays/skip-indexes.js +40 -0
- package/dist/clickhouse/overlays/ttl.js +34 -0
- package/dist/clickhouse/overlays/types.js +59 -0
- package/dist/clickhouse/ownership.js +83 -0
- package/dist/clickhouse/parser.js +674 -0
- package/dist/clickhouse/plan/commands.js +159 -0
- package/dist/clickhouse/plan/deep.js +345 -0
- package/dist/clickhouse/plan/diff.js +312 -0
- package/dist/clickhouse/plan/disruption.js +73 -0
- package/dist/clickhouse/plan/normalize.js +545 -0
- package/dist/clickhouse/plan/rebuild-handoff.js +57 -0
- package/dist/clickhouse/plan/report.js +26 -0
- package/dist/clickhouse/plan/rules.js +72 -0
- package/dist/clickhouse/plan/schema.js +67 -0
- package/dist/clickhouse/plan/server-format.js +35 -0
- package/dist/clickhouse/rebuild/backfill.js +265 -0
- package/dist/clickhouse/rebuild/engines.js +146 -0
- package/dist/clickhouse/rebuild/observe.js +260 -0
- package/dist/clickhouse/rebuild/op.js +152 -0
- package/dist/clickhouse/rebuild/partitions.js +65 -0
- package/dist/clickhouse/rebuild/receipts.js +120 -0
- package/dist/clickhouse/rebuild/replicas.js +121 -0
- package/dist/clickhouse/rebuild/shards.js +76 -0
- package/dist/clickhouse/rebuild/steps.js +383 -0
- package/dist/clickhouse/rebuild/verify.js +279 -0
- package/dist/clickhouse/row-types.js +151 -0
- package/dist/clickhouse/testing/fake-server.js +47 -0
- package/dist/clickhouse/testing/roundtrip-schema.js +25 -0
- package/dist/clickhouse/testing/writable-server.js +123 -0
- package/dist/clickhouse/tokens.js +23 -0
- package/dist/clickhouse/topology.js +463 -0
- package/dist/clickhouse/type-syntax.js +73 -0
- package/dist/clickhouse.js +25 -0
- package/dist/codegen/classifier-page.js +93 -0
- package/dist/codegen/clickhouse-module.js +249 -0
- package/dist/codegen/coverage-page.js +70 -0
- package/dist/codegen/docs-cli.js +3 -0
- package/dist/codegen/docs.js +222 -0
- package/dist/codegen/generate-cli.js +13 -0
- package/dist/codegen/generate.js +97 -0
- package/dist/codegen/package.js +28 -0
- package/dist/codegen/postgres-classifier-page.js +95 -0
- package/dist/codegen/postgres-module.js +418 -0
- package/dist/codegen/registry.js +52 -0
- package/dist/composites/audit-log-table.js +35 -0
- package/dist/composites/catalog.js +524 -0
- package/dist/composites/cdc-mirror.js +32 -0
- package/dist/composites/clickhouse.js +6 -0
- package/dist/composites/events-table.js +26 -0
- package/dist/composites/index.js +8 -0
- package/dist/composites/join-table.js +25 -0
- package/dist/composites/postgres.js +6 -0
- package/dist/composites/refreshed-view.js +24 -0
- package/dist/composites/replacing-table.js +28 -0
- package/dist/composites/rollup-view.js +29 -0
- package/dist/composites/sharded-table.js +27 -0
- package/dist/composites/soft-delete-table.js +34 -0
- package/dist/composites/tenant-table.js +26 -0
- package/dist/composites/typed.js +8 -0
- package/dist/config.js +206 -0
- package/dist/core/apply.js +93 -0
- package/dist/core/classifier.js +115 -0
- package/dist/core/container.js +69 -0
- package/dist/core/cursor.js +261 -0
- package/dist/core/diff.js +48 -0
- package/dist/core/entity.js +58 -0
- package/dist/core/find-templates.js +118 -0
- package/dist/core/foreign-tables.js +27 -0
- package/dist/core/handoff.js +32 -0
- package/dist/core/index.js +64 -0
- package/dist/core/interpolation.js +191 -0
- package/dist/core/normalize.js +43 -0
- package/dist/core/ownership.js +119 -0
- package/dist/core/receipts.js +22 -0
- package/dist/core/references.js +61 -0
- package/dist/core/statements.js +42 -0
- package/dist/core/template.js +79 -0
- package/dist/core/testing/http-stub.js +21 -0
- package/dist/core/tokens.js +202 -0
- package/dist/core/typed.js +40 -0
- package/dist/core/undeclarable.js +46 -0
- package/dist/coverage.js +161 -0
- package/dist/detect.js +32 -0
- package/dist/dialects.js +18 -0
- package/dist/files/build-root.js +72 -0
- package/dist/files/clickhouse.js +138 -0
- package/dist/files/common.js +58 -0
- package/dist/files/postgres.js +389 -0
- package/dist/generated/clickhouse-types.js +5 -0
- package/dist/generated/clickhouse.js +4361 -0
- package/dist/generated/postgres-types.js +227 -0
- package/dist/generated/postgres.js +3667 -0
- package/dist/import-generator.js +14 -0
- package/dist/import-parser.js +71 -0
- package/dist/index.js +24 -0
- package/dist/init-templates.js +290 -0
- package/dist/integrity.json +2 -2
- package/dist/lint/audit-catalog.js +31 -0
- package/dist/lint/audit-lineage.js +22 -0
- package/dist/lint/post-synth/audit-entries.js +34 -0
- package/dist/lint/post-synth/clickhouse-helpers.js +79 -0
- package/dist/lint/post-synth/clickhouse-type-check.js +162 -0
- package/dist/lint/post-synth/index.js +112 -0
- package/dist/lint/post-synth/postgres-audit-entries.js +35 -0
- package/dist/lint/post-synth/postgres-helpers.js +65 -0
- package/dist/lint/post-synth/postgres-names.js +507 -0
- package/dist/lint/post-synth/sql-helpers.js +23 -0
- package/dist/lint/post-synth/sql101.js +59 -0
- package/dist/lint/post-synth/sql102.js +34 -0
- package/dist/lint/post-synth/sqlch101.js +34 -0
- package/dist/lint/post-synth/sqlch102.js +23 -0
- package/dist/lint/post-synth/sqlch103.js +45 -0
- package/dist/lint/post-synth/sqlch104.js +41 -0
- package/dist/lint/post-synth/sqlch105.js +36 -0
- package/dist/lint/post-synth/sqlch106.js +27 -0
- package/dist/lint/post-synth/sqlch107.js +39 -0
- package/dist/lint/post-synth/sqlch108.js +28 -0
- package/dist/lint/post-synth/sqlch109.js +21 -0
- package/dist/lint/post-synth/sqlch110.js +31 -0
- package/dist/lint/post-synth/sqlch111.js +41 -0
- package/dist/lint/post-synth/sqlch112.js +28 -0
- package/dist/lint/post-synth/sqlch113.js +19 -0
- package/dist/lint/post-synth/sqlch114.js +26 -0
- package/dist/lint/post-synth/sqlch115.js +30 -0
- package/dist/lint/post-synth/sqlch116.js +22 -0
- package/dist/lint/post-synth/sqlch117.js +26 -0
- package/dist/lint/post-synth/sqlch118.js +27 -0
- package/dist/lint/post-synth/sqlch119.js +32 -0
- package/dist/lint/post-synth/sqlch120.js +20 -0
- package/dist/lint/post-synth/sqlch121.js +11 -0
- package/dist/lint/post-synth/sqlch122.js +11 -0
- package/dist/lint/post-synth/sqlch123.js +10 -0
- package/dist/lint/post-synth/sqlch124.js +21 -0
- package/dist/lint/post-synth/sqlch125.js +55 -0
- package/dist/lint/post-synth/sqlch126.js +62 -0
- package/dist/lint/post-synth/sqlch127.js +132 -0
- package/dist/lint/post-synth/sqlpg101.js +25 -0
- package/dist/lint/post-synth/sqlpg102.js +35 -0
- package/dist/lint/post-synth/sqlpg103.js +23 -0
- package/dist/lint/post-synth/sqlpg104.js +23 -0
- package/dist/lint/post-synth/sqlpg105.js +22 -0
- package/dist/lint/post-synth/sqlpg106.js +22 -0
- package/dist/lint/post-synth/sqlpg107.js +22 -0
- package/dist/lint/post-synth/sqlpg108.js +28 -0
- package/dist/lint/post-synth/sqlpg109.js +39 -0
- package/dist/lint/post-synth/sqlpg110.js +38 -0
- package/dist/lint/post-synth/sqlpg111.js +23 -0
- package/dist/lint/post-synth/sqlpg112.js +25 -0
- package/dist/lint/post-synth/sqlpg113.js +29 -0
- package/dist/lint/post-synth/sqlpg114.js +39 -0
- package/dist/lint/post-synth/sqlpg115.js +48 -0
- package/dist/lint/post-synth/sqlpg116.js +26 -0
- package/dist/lint/post-synth/sqlpg117.js +24 -0
- package/dist/lint/post-synth/sqlpg118.js +22 -0
- package/dist/lint/post-synth/sqlpg119.js +41 -0
- package/dist/lint/post-synth/sqlpg120.js +83 -0
- package/dist/lint/post-synth/sqlpg121.js +33 -0
- package/dist/lint/post-synth/sqlpg122.js +27 -0
- package/dist/lint/post-synth/sqlpg123.js +69 -0
- package/dist/lint/post-synth/sqlpg124.js +50 -0
- package/dist/lint/post-synth/sqlpg125.js +41 -0
- package/dist/lint/post-synth/sqlpg126.js +38 -0
- package/dist/lint/rules/index.js +12 -0
- package/dist/lint/rules/postgres-templates.js +27 -0
- package/dist/lint/rules/sqlch001.js +79 -0
- package/dist/lint/rules/sqlch002.js +124 -0
- package/dist/lint/rules/sqlch003.js +69 -0
- package/dist/lint/rules/sqlch004.js +83 -0
- package/dist/lint/rules/sqlpg001.js +68 -0
- package/dist/lint/rules/sqlpg002.js +69 -0
- package/dist/lint/rules/sqlpg003.js +58 -0
- package/dist/lint/rules/sqlpg004.js +77 -0
- package/dist/lint/rules/sqlpg005.js +86 -0
- package/dist/lint/rules/templates.js +25 -0
- package/dist/lint/rules/typed-names.js +132 -0
- package/dist/live-dialect.js +32 -0
- package/dist/lsp/catalog.js +44 -0
- package/dist/lsp/completions.js +136 -0
- package/dist/lsp/hover.js +115 -0
- package/dist/lsp/postgres-catalog.js +176 -0
- package/dist/lsp/postgres-template.js +171 -0
- package/dist/lsp/postgres.js +266 -0
- package/dist/lsp/refs.js +60 -0
- package/dist/lsp/registry.d.ts.map +1 -1
- package/dist/lsp/registry.js +19 -0
- package/dist/lsp/template.js +143 -0
- package/dist/manifest.json +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +293 -0
- package/dist/mcp/postgres.js +117 -0
- package/dist/migration-statements.js +243 -0
- package/dist/op/activities/clickhouse-apply.js +83 -0
- package/dist/op/activities/clickhouse-emulator.js +53 -0
- package/dist/op/activities/clickhouse-rebuild.js +119 -0
- package/dist/op/activities/index.js +26 -0
- package/dist/op/activities/postgres-apply.js +126 -0
- package/dist/op/activities/postgres-emulator.js +70 -0
- package/dist/op/activities/postgres-migration.js +156 -0
- package/dist/op/activities/sql-exec.js +57 -0
- package/dist/op/activity-contracts.js +103 -0
- package/dist/package-cli.js +14 -0
- package/dist/plugin.js +259 -0
- package/dist/postgres/access/acl.js +344 -0
- package/dist/postgres/access/changes.js +30 -0
- package/dist/postgres/access/import.js +61 -0
- package/dist/postgres/access/live.js +96 -0
- package/dist/postgres/apply/apply.js +557 -0
- package/dist/postgres/apply/statements.js +882 -0
- package/dist/postgres/catalog-types.js +18 -0
- package/dist/postgres/container.js +58 -0
- package/dist/postgres/entities.js +1390 -0
- package/dist/postgres/entity-types.js +28 -0
- package/dist/postgres/import/generator.js +283 -0
- package/dist/postgres/import/ir.js +53 -0
- package/dist/postgres/import/live-export.js +83 -0
- package/dist/postgres/keywords.js +32 -0
- package/dist/postgres/live/bind.js +130 -0
- package/dist/postgres/live/catalog-kinds.js +301 -0
- package/dist/postgres/live/catalog.js +644 -0
- package/dist/postgres/live/client.js +151 -0
- package/dist/postgres/live/describe-resources.js +135 -0
- package/dist/postgres/live/undeclarable.js +111 -0
- package/dist/postgres/migrate/backfill.js +170 -0
- package/dist/postgres/migrate/batches.js +122 -0
- package/dist/postgres/migrate/carry.js +518 -0
- package/dist/postgres/migrate/handoff.js +59 -0
- package/dist/postgres/migrate/names.js +61 -0
- package/dist/postgres/migrate/observe.js +360 -0
- package/dist/postgres/migrate/op.js +178 -0
- package/dist/postgres/migrate/receipts.js +117 -0
- package/dist/postgres/migrate/replication.js +106 -0
- package/dist/postgres/migrate/steps.js +514 -0
- package/dist/postgres/overlays/columns.js +31 -0
- package/dist/postgres/overlays/constraints.js +52 -0
- package/dist/postgres/overlays/extension-objects.js +88 -0
- package/dist/postgres/overlays/indexes.js +25 -0
- package/dist/postgres/overlays/kinds.js +2 -0
- package/dist/postgres/overlays/partitioning.js +23 -0
- package/dist/postgres/overlays/relations.js +25 -0
- package/dist/postgres/overlays/storage.js +65 -0
- package/dist/postgres/overlays/type-ddl.js +36 -0
- package/dist/postgres/overlays/types.js +74 -0
- package/dist/postgres/parser.js +1824 -0
- package/dist/postgres/plan/commands.js +137 -0
- package/dist/postgres/plan/deep.js +324 -0
- package/dist/postgres/plan/diff.js +499 -0
- package/dist/postgres/plan/disruption.js +64 -0
- package/dist/postgres/plan/normalize.js +889 -0
- package/dist/postgres/plan/report.js +21 -0
- package/dist/postgres/plan/rules.js +115 -0
- package/dist/postgres/plan/schema.js +105 -0
- package/dist/postgres/plan/server-normalize.js +166 -0
- package/dist/postgres/providers/aurora.js +44 -0
- package/dist/postgres/providers/azure.js +53 -0
- package/dist/postgres/providers/cloud-sql.js +41 -0
- package/dist/postgres/providers/index.js +73 -0
- package/dist/postgres/providers/neon.js +44 -0
- package/dist/postgres/providers/rds.js +47 -0
- package/dist/postgres/providers/supabase.js +45 -0
- package/dist/postgres/providers/types.js +21 -0
- package/dist/postgres/row-types.js +107 -0
- package/dist/postgres/testing/fake-client.js +34 -0
- package/dist/postgres/testing/migration.js +48 -0
- package/dist/postgres/testing/roundtrip-schema.js +64 -0
- package/dist/postgres/testing/server.js +47 -0
- package/dist/postgres/testing/writable-server.js +160 -0
- package/dist/postgres/tokens.js +41 -0
- package/dist/postgres.js +15 -0
- package/dist/read/clickhouse.js +82 -0
- package/dist/read/objects.js +44 -0
- package/dist/read/postgres.js +104 -0
- package/dist/read.js +52 -0
- package/dist/receipts.js +207 -0
- package/dist/serializer.js +172 -0
- package/dist/skill-defs.js +93 -0
- package/dist/spec/catalog.js +191 -0
- package/dist/spec/fetch.d.ts.map +1 -1
- package/dist/spec/fetch.js +90 -0
- package/dist/spec/pin.js +42 -0
- package/dist/spec/postgres-catalog.js +171 -0
- package/dist/spec/postgres-fetch.js +91 -0
- package/dist/spec/postgres-pin.js +82 -0
- package/dist/sql-files.js +206 -0
- package/dist/sql-types-command.js +97 -0
- package/dist/sql-types.js +323 -0
- package/dist/token-source.js +156 -0
- package/dist/validate-cli.js +5 -0
- package/dist/validate.js +151 -0
- package/dist/workspace-outputs.js +191 -0
- package/package.json +7 -7
- package/src/codegen/package.ts +2 -2
- package/src/lint/rules/typescript-7.test.ts +2 -1
- package/src/lsp/catalog.ts +2 -2
- package/src/lsp/postgres-catalog.ts +2 -2
- package/src/lsp/registry.ts +2 -1
- package/src/mcp/index.ts +4 -2
- package/src/spec/fetch.ts +2 -2
- package/src/spec/postgres-fetch.ts +2 -2
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the common extensions add, for lint: the types, functions, index
|
|
3
|
+
* access methods and operator classes a declaration may name once the project
|
|
4
|
+
* declares the extension. The pinned catalogs are read from a server with no
|
|
5
|
+
* extension installed, so none of these are in them.
|
|
6
|
+
*
|
|
7
|
+
* The list is not exhaustive. A name the core catalog does not have and no
|
|
8
|
+
* entry here covers is reported as a warning when the project declares any
|
|
9
|
+
* extension (it may come from one), and as an error when it declares none.
|
|
10
|
+
* A name an entry here covers, used without that extension declared, is an
|
|
11
|
+
* error that names the extension.
|
|
12
|
+
*
|
|
13
|
+
* Sources: the reference page of each contrib module
|
|
14
|
+
* (https://www.postgresql.org/docs/18/contrib.html), PostGIS
|
|
15
|
+
* (https://postgis.net/docs/reference.html) and pgvector
|
|
16
|
+
* (https://github.com/pgvector/pgvector#reference).
|
|
17
|
+
*/
|
|
18
|
+
const BTREE_GIN = [
|
|
19
|
+
"int2_ops", "int4_ops", "int8_ops", "float4_ops", "float8_ops", "money_ops", "oid_ops", "timestamp_ops", "timestamptz_ops",
|
|
20
|
+
"time_ops", "timetz_ops", "date_ops", "interval_ops", "macaddr_ops", "macaddr8_ops", "inet_ops", "cidr_ops", "text_ops",
|
|
21
|
+
"varchar_ops", "char_ops", "bytea_ops", "bit_ops", "varbit_ops", "numeric_ops", "enum_ops", "uuid_ops", "name_ops",
|
|
22
|
+
"bool_ops", "bpchar_ops",
|
|
23
|
+
];
|
|
24
|
+
const BTREE_GIST = [
|
|
25
|
+
"gist_int2_ops", "gist_int4_ops", "gist_int8_ops", "gist_float4_ops", "gist_float8_ops", "gist_numeric_ops", "gist_oid_ops",
|
|
26
|
+
"gist_timestamp_ops", "gist_timestamptz_ops", "gist_time_ops", "gist_timetz_ops", "gist_date_ops", "gist_interval_ops",
|
|
27
|
+
"gist_cash_ops", "gist_macaddr_ops", "gist_macaddr8_ops", "gist_text_ops", "gist_bpchar_ops", "gist_bytea_ops", "gist_bit_ops",
|
|
28
|
+
"gist_vbit_ops", "gist_inet_ops", "gist_cidr_ops", "gist_uuid_ops", "gist_enum_ops", "gist_bool_ops",
|
|
29
|
+
];
|
|
30
|
+
const VECTOR_OPS = ["vector_l2_ops", "vector_ip_ops", "vector_cosine_ops", "vector_l1_ops", "halfvec_l2_ops", "halfvec_ip_ops", "halfvec_cosine_ops", "halfvec_l1_ops", "sparsevec_l2_ops", "sparsevec_ip_ops", "sparsevec_cosine_ops", "sparsevec_l1_ops", "bit_hamming_ops", "bit_jaccard_ops"];
|
|
31
|
+
export const EXTENSION_OBJECTS = {
|
|
32
|
+
bloom: { accessMethods: ["bloom"], opclasses: { bloom: ["int4_ops", "text_ops"] } },
|
|
33
|
+
btree_gin: { opclasses: { gin: BTREE_GIN } },
|
|
34
|
+
btree_gist: { opclasses: { gist: BTREE_GIST } },
|
|
35
|
+
citext: { types: ["citext"], opclasses: { btree: ["citext_ops", "citext_pattern_ops"], hash: ["citext_ops"] } },
|
|
36
|
+
cube: { types: ["cube"], functions: ["cube", "cube_dim", "cube_ll_coord", "cube_ur_coord", "cube_is_point", "cube_enlarge", "cube_subset", "cube_union", "cube_inter", "cube_size", "cube_distance"], opclasses: { gist: ["gist_cube_ops"] } },
|
|
37
|
+
earthdistance: { types: ["earth"], functions: ["earth", "earth_distance", "earth_box", "ll_to_earth", "latitude", "longitude", "sec_to_gc", "gc_to_sec"] },
|
|
38
|
+
fuzzystrmatch: { functions: ["soundex", "difference", "levenshtein", "levenshtein_less_equal", "metaphone", "dmetaphone", "dmetaphone_alt", "daitch_mokotoff"] },
|
|
39
|
+
hstore: {
|
|
40
|
+
types: ["hstore"],
|
|
41
|
+
functions: ["hstore", "akeys", "avals", "skeys", "svals", "hstore_to_array", "hstore_to_matrix", "hstore_to_json", "hstore_to_jsonb", "hstore_to_json_loose", "hstore_to_jsonb_loose", "slice", "exist", "defined", "delete", "each", "populate_record"],
|
|
42
|
+
opclasses: { gist: ["gist_hstore_ops"], gin: ["gin_hstore_ops"], btree: ["btree_hstore_ops"], hash: ["hash_hstore_ops"] },
|
|
43
|
+
},
|
|
44
|
+
intarray: {
|
|
45
|
+
functions: ["icount", "sort", "sort_asc", "sort_desc", "uniq", "idx", "subarray", "intset"],
|
|
46
|
+
opclasses: { gist: ["gist__int_ops", "gist__intbig_ops"], gin: ["gin__int_ops"] },
|
|
47
|
+
},
|
|
48
|
+
isn: { types: ["ean13", "isbn", "isbn13", "ismn", "ismn13", "issn", "issn13", "upc"], functions: ["isn_weak", "make_valid", "is_valid"] },
|
|
49
|
+
ltree: {
|
|
50
|
+
types: ["ltree", "lquery", "ltxtquery"],
|
|
51
|
+
functions: ["subltree", "subpath", "nlevel", "index", "text2ltree", "ltree2text", "lca"],
|
|
52
|
+
opclasses: { gist: ["gist_ltree_ops", "gist__ltree_ops"], btree: ["ltree_ops"], hash: ["hash_ltree_ops"] },
|
|
53
|
+
},
|
|
54
|
+
pg_trgm: {
|
|
55
|
+
functions: ["similarity", "word_similarity", "strict_word_similarity", "show_trgm", "show_limit", "set_limit"],
|
|
56
|
+
opclasses: { gin: ["gin_trgm_ops"], gist: ["gist_trgm_ops"] },
|
|
57
|
+
},
|
|
58
|
+
pgcrypto: {
|
|
59
|
+
functions: [
|
|
60
|
+
"digest", "hmac", "crypt", "gen_salt", "gen_random_bytes", "gen_random_uuid", "encrypt", "decrypt", "encrypt_iv", "decrypt_iv",
|
|
61
|
+
"pgp_sym_encrypt", "pgp_sym_encrypt_bytea", "pgp_sym_decrypt", "pgp_sym_decrypt_bytea", "pgp_pub_encrypt", "pgp_pub_encrypt_bytea",
|
|
62
|
+
"pgp_pub_decrypt", "pgp_pub_decrypt_bytea", "pgp_key_id", "armor", "dearmor", "pgp_armor_headers",
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
postgis: {
|
|
66
|
+
types: ["geometry", "geography", "box2d", "box3d"],
|
|
67
|
+
functionPrefixes: ["st_", "postgis_"],
|
|
68
|
+
opclasses: {
|
|
69
|
+
gist: ["gist_geometry_ops_2d", "gist_geometry_ops_nd", "gist_geography_ops"],
|
|
70
|
+
brin: ["brin_geometry_inclusion_ops_2d", "brin_geometry_inclusion_ops_3d", "brin_geometry_inclusion_ops_4d", "brin_geography_inclusion_ops"],
|
|
71
|
+
spgist: ["spgist_geometry_ops_2d", "spgist_geometry_ops_3d", "spgist_geometry_ops_nd", "spgist_geography_ops_nd"],
|
|
72
|
+
btree: ["btree_geometry_ops", "btree_geography_ops"],
|
|
73
|
+
hash: ["hash_geometry_ops"],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
seg: { types: ["seg"], opclasses: { gist: ["gist_seg_ops"] } },
|
|
77
|
+
tablefunc: { functions: ["crosstab", "normal_rand", "connectby"] },
|
|
78
|
+
unaccent: { functions: ["unaccent"] },
|
|
79
|
+
"uuid-ossp": {
|
|
80
|
+
functions: ["uuid_generate_v1", "uuid_generate_v1mc", "uuid_generate_v3", "uuid_generate_v4", "uuid_generate_v5", "uuid_nil", "uuid_ns_dns", "uuid_ns_url", "uuid_ns_oid", "uuid_ns_x500"],
|
|
81
|
+
},
|
|
82
|
+
vector: {
|
|
83
|
+
types: ["vector", "halfvec", "sparsevec"],
|
|
84
|
+
functions: ["l2_distance", "inner_product", "cosine_distance", "l1_distance", "vector_dims", "vector_norm", "l2_norm", "l2_normalize", "binary_quantize", "subvector", "hamming_distance", "jaccard_distance"],
|
|
85
|
+
accessMethods: ["hnsw", "ivfflat"],
|
|
86
|
+
opclasses: { hnsw: VECTOR_OPS, ivfflat: VECTOR_OPS.filter((o) => !o.startsWith("sparsevec") && !o.endsWith("l1_ops") && o !== "bit_jaccard_ops") },
|
|
87
|
+
},
|
|
88
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index clauses. Which access method supports which of them is in the catalog
|
|
3
|
+
* (`INDEX_METHOD_PROPERTIES`: `can_include`, `can_unique`, ...); the clause
|
|
4
|
+
* shapes are here.
|
|
5
|
+
*/
|
|
6
|
+
import { arg } from "./kinds.js";
|
|
7
|
+
export const INDEX_CLAUSES = {
|
|
8
|
+
key: {
|
|
9
|
+
summary: "{ column | (expression) } [COLLATE collation] [opclass [(parameters)]] [ASC | DESC] [NULLS FIRST | LAST]",
|
|
10
|
+
args: [
|
|
11
|
+
arg("key", "expression"),
|
|
12
|
+
arg("collation", "identifier", { optional: true }),
|
|
13
|
+
arg("opclass", "identifier", { optional: true }),
|
|
14
|
+
arg("order", "keyword", { optional: true, values: ["ASC", "DESC"] }),
|
|
15
|
+
arg("nulls", "keyword", { optional: true, values: ["FIRST", "LAST"] }),
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
using: { summary: "USING method", args: [arg("method", "keyword")] },
|
|
19
|
+
include: { summary: "INCLUDE (columns)", args: [arg("columns", "column", { repeated: true })] },
|
|
20
|
+
where: { summary: "WHERE predicate: a partial index", args: [arg("predicate", "expression")] },
|
|
21
|
+
nullsNotDistinct: { summary: "NULLS [NOT] DISTINCT, on a unique index", args: [arg("notDistinct", "boolean")], since: 15 },
|
|
22
|
+
tablespace: { summary: "TABLESPACE name", args: [arg("tablespace", "identifier")] },
|
|
23
|
+
concurrently: { summary: "CREATE INDEX CONCURRENTLY: not inside a transaction block", args: [arg("concurrently", "boolean")] },
|
|
24
|
+
only: { summary: "ON ONLY parent: an index on a partitioned table's parent without its partitions", args: [arg("only", "boolean")] },
|
|
25
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Partitioning: `PARTITION BY`, partition bounds, `DEFAULT` partitions, `ATTACH` and `DETACH`. */
|
|
2
|
+
import { arg } from "./kinds.js";
|
|
3
|
+
export const PARTITION_STRATEGIES = ["RANGE", "LIST", "HASH"];
|
|
4
|
+
export const PARTITIONING = {
|
|
5
|
+
partitionBy: {
|
|
6
|
+
summary: "PARTITION BY { RANGE | LIST | HASH } ({ column | (expression) } [COLLATE c] [opclass], ...)",
|
|
7
|
+
args: [arg("strategy", "keyword", { values: PARTITION_STRATEGIES }), arg("keys", "expression", { repeated: true })],
|
|
8
|
+
},
|
|
9
|
+
forValuesRange: { summary: "FOR VALUES FROM (bounds) TO (bounds); MINVALUE and MAXVALUE stand for unbounded", args: [arg("from", "expression", { repeated: true }), arg("to", "expression", { repeated: true })] },
|
|
10
|
+
forValuesList: { summary: "FOR VALUES IN (values)", args: [arg("values", "expression", { repeated: true })] },
|
|
11
|
+
forValuesHash: {
|
|
12
|
+
summary: "FOR VALUES WITH (MODULUS m, REMAINDER r)",
|
|
13
|
+
args: [arg("modulus", "number", { range: [1, 2147483647] }), arg("remainder", "number", { range: [0, 2147483646] })],
|
|
14
|
+
},
|
|
15
|
+
default: { summary: "DEFAULT partition", args: [] },
|
|
16
|
+
attach: { summary: "ALTER TABLE parent ATTACH PARTITION child { FOR VALUES ... | DEFAULT }", args: [arg("partition", "identifier")] },
|
|
17
|
+
detach: {
|
|
18
|
+
summary: "ALTER TABLE parent DETACH PARTITION child [CONCURRENTLY | FINALIZE]",
|
|
19
|
+
args: [arg("partition", "identifier"), arg("mode", "keyword", { optional: true, values: ["CONCURRENTLY", "FINALIZE"] })],
|
|
20
|
+
},
|
|
21
|
+
mergePartitions: { summary: "ALTER TABLE parent MERGE PARTITIONS (children) INTO child", args: [arg("partitions", "identifier", { repeated: true })], since: 18 },
|
|
22
|
+
splitPartition: { summary: "ALTER TABLE parent SPLIT PARTITION child INTO (partitions)", args: [arg("partition", "identifier")], since: 18 },
|
|
23
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Table and relation clauses, views, materialized views and sequences. */
|
|
2
|
+
import { arg } from "./kinds.js";
|
|
3
|
+
export const RELATION_CLAUSES = {
|
|
4
|
+
persistence: { summary: "{ TEMPORARY | UNLOGGED } TABLE", args: [arg("persistence", "keyword", { values: ["TEMPORARY", "UNLOGGED"] })] },
|
|
5
|
+
inherits: { summary: "INHERITS (parents)", args: [arg("parents", "identifier", { repeated: true })] },
|
|
6
|
+
tablespace: { summary: "TABLESPACE name", args: [arg("tablespace", "identifier")] },
|
|
7
|
+
using: { summary: "USING access_method", args: [arg("method", "keyword")] },
|
|
8
|
+
onCommit: { summary: "ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP }, temporary tables only", args: [arg("action", "keyword", { values: ["PRESERVE ROWS", "DELETE ROWS", "DROP"] })] },
|
|
9
|
+
withParameters: { summary: "WITH (storage_parameter = value, ...)", args: [arg("parameters", "expression", { repeated: true })] },
|
|
10
|
+
likeSource: { summary: "LIKE source [INCLUDING | EXCLUDING option]", args: [arg("source", "identifier"), arg("options", "keyword", { optional: true, repeated: true, values: ["COMMENTS", "COMPRESSION", "CONSTRAINTS", "DEFAULTS", "GENERATED", "IDENTITY", "INDEXES", "STATISTICS", "STORAGE", "ALL"] })] },
|
|
11
|
+
ofType: { summary: "OF composite_type: a typed table", args: [arg("type", "identifier")] },
|
|
12
|
+
};
|
|
13
|
+
export const VIEW_CLAUSES = {
|
|
14
|
+
query: { summary: "AS query", args: [arg("query", "query")] },
|
|
15
|
+
columns: { summary: "(column_names)", args: [arg("columns", "column", { repeated: true })] },
|
|
16
|
+
recursive: { summary: "CREATE RECURSIVE VIEW", args: [arg("recursive", "boolean")] },
|
|
17
|
+
checkOption: { summary: "WITH [CASCADED | LOCAL] CHECK OPTION, on an updatable view", args: [arg("option", "keyword", { values: ["CASCADED", "LOCAL"] })] },
|
|
18
|
+
securityInvoker: { summary: "WITH (security_invoker = true): check permissions as the caller", args: [arg("securityInvoker", "boolean")], since: 15 },
|
|
19
|
+
securityBarrier: { summary: "WITH (security_barrier = true)", args: [arg("securityBarrier", "boolean")] },
|
|
20
|
+
withNoData: { summary: "WITH NO DATA: a materialized view created unpopulated", args: [arg("noData", "boolean")] },
|
|
21
|
+
};
|
|
22
|
+
export const SEQUENCE_CLAUSES = {
|
|
23
|
+
persistence: { summary: "[ { TEMPORARY | UNLOGGED } ] SEQUENCE", args: [arg("persistence", "keyword", { values: ["TEMPORARY", "UNLOGGED"] })] },
|
|
24
|
+
options: { summary: "AS type, INCREMENT, MINVALUE, MAXVALUE, START, CACHE, [NO] CYCLE, OWNED BY (see SEQUENCE_OPTIONS)", args: [] },
|
|
25
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage parameters (`WITH (fillfactor = 70)`): the overlay half.
|
|
3
|
+
*
|
|
4
|
+
* No catalog table lists them; they are compiled into `reloptions.c`.
|
|
5
|
+
* Generation probes the server instead: it tries every `pg_settings` name plus
|
|
6
|
+
* {@link STORAGE_PARAMETER_SEED} as `WITH (name = 1)` on each relation kind
|
|
7
|
+
* and keeps every name the server does not reject as unrecognized. The probe
|
|
8
|
+
* yields names only, so the types and ranges are here, and generation fails
|
|
9
|
+
* when a name the probe found has no entry (a pin move that adds a parameter
|
|
10
|
+
* has to type it in the same commit) or an entry names nothing the probe found.
|
|
11
|
+
*/
|
|
12
|
+
import { INT_MAX } from "./kinds.js";
|
|
13
|
+
/** The reloptions that are not `pg_settings` names, so the probe would never try them. */
|
|
14
|
+
export const STORAGE_PARAMETER_SEED = [
|
|
15
|
+
"fillfactor", "toast_tuple_target", "parallel_workers", "user_catalog_table", "autovacuum_enabled",
|
|
16
|
+
"vacuum_index_cleanup", "vacuum_truncate", "autovacuum_vacuum_threshold", "autovacuum_vacuum_scale_factor",
|
|
17
|
+
"autovacuum_vacuum_max_threshold", "autovacuum_vacuum_insert_threshold", "autovacuum_vacuum_insert_scale_factor",
|
|
18
|
+
"autovacuum_analyze_threshold", "autovacuum_analyze_scale_factor", "autovacuum_vacuum_cost_delay",
|
|
19
|
+
"autovacuum_vacuum_cost_limit", "autovacuum_freeze_min_age", "autovacuum_freeze_max_age",
|
|
20
|
+
"autovacuum_freeze_table_age", "autovacuum_multixact_freeze_min_age", "autovacuum_multixact_freeze_max_age",
|
|
21
|
+
"autovacuum_multixact_freeze_table_age", "log_autovacuum_min_duration", "deduplicate_items", "buffering",
|
|
22
|
+
"fastupdate", "gin_pending_list_limit", "pages_per_range", "autosummarize", "security_barrier",
|
|
23
|
+
"security_invoker", "check_option", "vacuum_cleanup_index_scale_factor", "vacuum_max_eager_freeze_failure_rate",
|
|
24
|
+
];
|
|
25
|
+
const int = (min, max) => ({ kind: "integer", range: [min, max] });
|
|
26
|
+
const real = (min, max) => ({ kind: "real", range: [min, max] });
|
|
27
|
+
const bool = { kind: "boolean" };
|
|
28
|
+
/** Keyed by parameter name; the same name has the same type on every relation kind that accepts it. */
|
|
29
|
+
export const STORAGE_PARAMETER_TYPES = {
|
|
30
|
+
fillfactor: int(10, 100),
|
|
31
|
+
toast_tuple_target: int(128, 1073741823),
|
|
32
|
+
parallel_workers: int(0, 1024),
|
|
33
|
+
user_catalog_table: bool,
|
|
34
|
+
autovacuum_enabled: bool,
|
|
35
|
+
vacuum_index_cleanup: { kind: "enum", values: ["auto", "on", "off", "true", "false"] },
|
|
36
|
+
vacuum_truncate: bool,
|
|
37
|
+
autovacuum_vacuum_threshold: int(0, INT_MAX),
|
|
38
|
+
autovacuum_vacuum_scale_factor: real(0, 100),
|
|
39
|
+
autovacuum_vacuum_max_threshold: int(-1, INT_MAX),
|
|
40
|
+
autovacuum_vacuum_insert_threshold: int(-1, INT_MAX),
|
|
41
|
+
autovacuum_vacuum_insert_scale_factor: real(0, 100),
|
|
42
|
+
autovacuum_analyze_threshold: int(0, INT_MAX),
|
|
43
|
+
autovacuum_analyze_scale_factor: real(0, 100),
|
|
44
|
+
autovacuum_vacuum_cost_delay: real(-1, 100),
|
|
45
|
+
autovacuum_vacuum_cost_limit: int(-1, 10000),
|
|
46
|
+
autovacuum_freeze_min_age: int(0, 1000000000),
|
|
47
|
+
autovacuum_freeze_max_age: int(100000, 2000000000),
|
|
48
|
+
autovacuum_freeze_table_age: int(0, 2000000000),
|
|
49
|
+
autovacuum_multixact_freeze_min_age: int(0, 1000000000),
|
|
50
|
+
autovacuum_multixact_freeze_max_age: int(10000, 2000000000),
|
|
51
|
+
autovacuum_multixact_freeze_table_age: int(0, 2000000000),
|
|
52
|
+
log_autovacuum_min_duration: int(-1, INT_MAX),
|
|
53
|
+
vacuum_max_eager_freeze_failure_rate: real(0, 1),
|
|
54
|
+
security_barrier: bool,
|
|
55
|
+
security_invoker: bool,
|
|
56
|
+
check_option: { kind: "enum", values: ["local", "cascaded"] },
|
|
57
|
+
deduplicate_items: bool,
|
|
58
|
+
// Accepted and ignored since 14, which removed the feature; kept so a dump from 13 still restores.
|
|
59
|
+
vacuum_cleanup_index_scale_factor: real(0, 10000000000),
|
|
60
|
+
buffering: { kind: "enum", values: ["on", "off", "auto"] },
|
|
61
|
+
fastupdate: bool,
|
|
62
|
+
gin_pending_list_limit: int(64, INT_MAX),
|
|
63
|
+
pages_per_range: int(1, 131072),
|
|
64
|
+
autosummarize: bool,
|
|
65
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `CREATE TYPE` and `CREATE DOMAIN`: the forms for new types. The catalog lists
|
|
3
|
+
* the built-ins; the grammar for declaring more is not in it.
|
|
4
|
+
*/
|
|
5
|
+
import { arg } from "./kinds.js";
|
|
6
|
+
export const TYPE_DDL = {
|
|
7
|
+
enum: {
|
|
8
|
+
summary: "CREATE TYPE name AS ENUM ('label', ...)",
|
|
9
|
+
args: [arg("labels", "string", { repeated: true })],
|
|
10
|
+
},
|
|
11
|
+
composite: {
|
|
12
|
+
summary: "CREATE TYPE name AS (attribute type [COLLATE c], ...)",
|
|
13
|
+
args: [arg("attributes", "type", { repeated: true })],
|
|
14
|
+
},
|
|
15
|
+
domain: {
|
|
16
|
+
summary: "CREATE DOMAIN name [AS] type [COLLATE c] [DEFAULT expression] [NOT NULL] [CHECK (expression)]",
|
|
17
|
+
args: [
|
|
18
|
+
arg("type", "type"),
|
|
19
|
+
arg("collation", "identifier", { optional: true }),
|
|
20
|
+
arg("default", "expression", { optional: true }),
|
|
21
|
+
arg("notNull", "boolean", { optional: true }),
|
|
22
|
+
arg("check", "expression", { optional: true, repeated: true }),
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
range: {
|
|
26
|
+
summary: "CREATE TYPE name AS RANGE (SUBTYPE = type [, SUBTYPE_OPCLASS, COLLATION, CANONICAL, SUBTYPE_DIFF, MULTIRANGE_TYPE_NAME])",
|
|
27
|
+
args: [
|
|
28
|
+
arg("subtype", "type"),
|
|
29
|
+
arg("subtypeOpclass", "identifier", { optional: true }),
|
|
30
|
+
arg("collation", "identifier", { optional: true }),
|
|
31
|
+
arg("canonical", "identifier", { optional: true }),
|
|
32
|
+
arg("subtypeDiff", "identifier", { optional: true }),
|
|
33
|
+
arg("multirangeTypeName", "identifier", { optional: true }),
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column type parameters and spellings: the overlay half.
|
|
3
|
+
*
|
|
4
|
+
* `pg_type` lists the types and `format_type()` gives each one's SQL spelling
|
|
5
|
+
* (`int4` is `integer`). The parameters (`varchar(n)`, `numeric(p, s)`,
|
|
6
|
+
* `timestamp(p)`, `interval` fields) and the spellings no catalog row carries
|
|
7
|
+
* (`int`, `decimal`, `serial`) are in no catalog table. A type missing here
|
|
8
|
+
* takes no parameters; generation fails when a key here is not a type at the
|
|
9
|
+
* pins.
|
|
10
|
+
*/
|
|
11
|
+
import { arg } from "./kinds.js";
|
|
12
|
+
/** Keyed by the canonical SQL name `format_type()` gives. */
|
|
13
|
+
export const COLUMN_TYPE_PARAMETERS = {
|
|
14
|
+
"character varying": [arg("length", "number", { optional: true, range: [1, 10485760] })],
|
|
15
|
+
character: [arg("length", "number", { optional: true, range: [1, 10485760] })],
|
|
16
|
+
bit: [arg("length", "number", { optional: true, range: [1, 83886080] })],
|
|
17
|
+
"bit varying": [arg("length", "number", { optional: true, range: [1, 83886080] })],
|
|
18
|
+
numeric: [arg("precision", "number", { optional: true, range: [1, 1000] }), arg("scale", "number", { optional: true, range: [-1000, 1000] })],
|
|
19
|
+
"timestamp without time zone": [arg("precision", "number", { optional: true, range: [0, 6] })],
|
|
20
|
+
"timestamp with time zone": [arg("precision", "number", { optional: true, range: [0, 6] })],
|
|
21
|
+
"time without time zone": [arg("precision", "number", { optional: true, range: [0, 6] })],
|
|
22
|
+
"time with time zone": [arg("precision", "number", { optional: true, range: [0, 6] })],
|
|
23
|
+
interval: [
|
|
24
|
+
arg("fields", "keyword", {
|
|
25
|
+
optional: true,
|
|
26
|
+
values: ["YEAR", "MONTH", "DAY", "HOUR", "MINUTE", "SECOND", "YEAR TO MONTH", "DAY TO HOUR", "DAY TO MINUTE", "DAY TO SECOND", "HOUR TO MINUTE", "HOUR TO SECOND", "MINUTE TO SECOND"],
|
|
27
|
+
}),
|
|
28
|
+
arg("precision", "number", { optional: true, range: [0, 6] }),
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
/** Spellings that are not `format_type()` output, and the canonical name each stands for. */
|
|
32
|
+
export const TYPE_SPELLINGS = {
|
|
33
|
+
int: "integer",
|
|
34
|
+
decimal: "numeric",
|
|
35
|
+
float: "double precision",
|
|
36
|
+
varchar: "character varying",
|
|
37
|
+
char: "character",
|
|
38
|
+
varbit: "bit varying",
|
|
39
|
+
timestamp: "timestamp without time zone",
|
|
40
|
+
timestamptz: "timestamp with time zone",
|
|
41
|
+
time: "time without time zone",
|
|
42
|
+
timetz: "time with time zone",
|
|
43
|
+
};
|
|
44
|
+
/** Pseudo-types that declare a sequence-backed column; each stands for a type plus a default and a sequence. */
|
|
45
|
+
export const SERIAL_TYPES = {
|
|
46
|
+
smallserial: "smallint",
|
|
47
|
+
serial: "integer",
|
|
48
|
+
bigserial: "bigint",
|
|
49
|
+
};
|
|
50
|
+
/** An array suffix: `integer[]`, `text[3]`, `ARRAY`. Dimensions are documentation only to the server. */
|
|
51
|
+
export const ARRAY_SUFFIX = { brackets: "[]", dimensioned: "[n]", keyword: "ARRAY" };
|
|
52
|
+
/**
|
|
53
|
+
* Spellings the grammar accepts that neither `pg_type` nor {@link TYPE_SPELLINGS}
|
|
54
|
+
* lists, and the canonical name each stands for (gram.y, `Numeric`,
|
|
55
|
+
* `Character`, `ConstDatetime`). Lint reads them beside the catalog so every
|
|
56
|
+
* spelling Postgres accepts resolves. `float(p)` is `real` for p up to 24 and
|
|
57
|
+
* `double precision` above; lint reads the precision.
|
|
58
|
+
*/
|
|
59
|
+
export const GRAMMAR_TYPE_SPELLINGS = {
|
|
60
|
+
dec: "numeric",
|
|
61
|
+
"char varying": "character varying",
|
|
62
|
+
"national character": "character",
|
|
63
|
+
"national char": "character",
|
|
64
|
+
nchar: "character",
|
|
65
|
+
"national character varying": "character varying",
|
|
66
|
+
"national char varying": "character varying",
|
|
67
|
+
"nchar varying": "character varying",
|
|
68
|
+
};
|
|
69
|
+
/** The serial spellings with a width suffix, beside {@link SERIAL_TYPES}. */
|
|
70
|
+
export const SERIAL_WIDTH_SPELLINGS = {
|
|
71
|
+
serial2: "smallint",
|
|
72
|
+
serial4: "integer",
|
|
73
|
+
serial8: "bigint",
|
|
74
|
+
};
|