@rocicorp/zero 1.10.0-canary.2 → 1.10.0-canary.21
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/out/replicache/src/btree/read.d.ts +12 -1
- package/out/replicache/src/btree/read.d.ts.map +1 -1
- package/out/replicache/src/btree/read.js +24 -12
- package/out/replicache/src/btree/read.js.map +1 -1
- package/out/replicache/src/db/rebase.d.ts +14 -2
- package/out/replicache/src/db/rebase.d.ts.map +1 -1
- package/out/replicache/src/db/rebase.js +27 -5
- package/out/replicache/src/db/rebase.js.map +1 -1
- package/out/replicache/src/db/write.js.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.js +27 -4
- package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/sqlite-store.d.ts +11 -0
- package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
- package/out/replicache/src/kv/sqlite-store.js +43 -3
- package/out/replicache/src/kv/sqlite-store.js.map +1 -1
- package/out/replicache/src/persist/persist.d.ts.map +1 -1
- package/out/replicache/src/persist/persist.js +12 -5
- package/out/replicache/src/persist/persist.js.map +1 -1
- package/out/replicache/src/persist/refresh.js +6 -2
- package/out/replicache/src/persist/refresh.js.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.js +14 -2
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/replicache-options.d.ts +9 -0
- package/out/replicache/src/replicache-options.d.ts.map +1 -1
- package/out/replicache/src/transactions.d.ts.map +1 -1
- package/out/replicache/src/transactions.js +1 -1
- package/out/replicache/src/transactions.js.map +1 -1
- package/out/shared/src/error.d.ts +11 -0
- package/out/shared/src/error.d.ts.map +1 -1
- package/out/shared/src/error.js +35 -1
- package/out/shared/src/error.js.map +1 -1
- package/out/shared/src/hash.d.ts.map +1 -1
- package/out/shared/src/hash.js +105 -10
- package/out/shared/src/hash.js.map +1 -1
- package/out/shared/src/map.d.ts +7 -2
- package/out/shared/src/map.d.ts.map +1 -1
- package/out/shared/src/map.js.map +1 -1
- package/out/shared/src/promise-race.d.ts +14 -0
- package/out/shared/src/promise-race.d.ts.map +1 -1
- package/out/shared/src/promise-race.js +32 -1
- package/out/shared/src/promise-race.js.map +1 -1
- package/out/zero/package.js +2 -3
- package/out/zero/package.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +8 -1
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts +5 -0
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +16 -3
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +36 -7
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +121 -46
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/db/create.d.ts.map +1 -1
- package/out/zero-cache/src/db/create.js +4 -1
- package/out/zero-cache/src/db/create.js.map +1 -1
- package/out/zero-cache/src/db/index-predicate.d.ts +4 -0
- package/out/zero-cache/src/db/index-predicate.d.ts.map +1 -0
- package/out/zero-cache/src/db/index-predicate.js +46 -0
- package/out/zero-cache/src/db/index-predicate.js.map +1 -0
- package/out/zero-cache/src/db/lite-tables.d.ts +10 -2
- package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
- package/out/zero-cache/src/db/lite-tables.js +8 -3
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +5 -3
- package/out/zero-cache/src/db/migration-lite.js.map +1 -1
- package/out/zero-cache/src/db/specs.d.ts +41 -0
- package/out/zero-cache/src/db/specs.d.ts.map +1 -1
- package/out/zero-cache/src/db/specs.js +30 -3
- package/out/zero-cache/src/db/specs.js.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.d.ts +5 -15
- package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.js +39 -73
- package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +27 -15
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +4 -4
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/server/replicator.js +8 -4
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/runner/run-worker.js +1 -1
- package/out/zero-cache/src/server/worker-urls.d.ts +0 -1
- package/out/zero-cache/src/server/worker-urls.d.ts.map +1 -1
- package/out/zero-cache/src/server/worker-urls.js +1 -2
- package/out/zero-cache/src/server/worker-urls.js.map +1 -1
- package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
- package/out/zero-cache/src/services/analyze.js +1 -0
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts +12 -2
- package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js +14 -3
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js +10 -41
- package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +3 -2
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +42 -16
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +34 -2
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +47 -19
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/decommission.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/decommission.js +20 -11
- package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +1 -0
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js +58 -80
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +20 -0
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +43 -3
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +24 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js +35 -5
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +1513 -229
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +2 -2
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts +19 -0
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +581 -0
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +15 -6
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +137 -20
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.js +82 -13
- package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +128 -21
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +5 -5
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +2 -0
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +3 -0
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts +1 -4
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +11 -18
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js +8 -3
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js +4 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.d.ts +34 -0
- package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.js +67 -0
- package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +2 -4
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +8 -2
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +34 -13
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +165 -36
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +4 -9
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.js +12 -3
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js +11 -5
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/shard-sampling.d.ts +11 -0
- package/out/zero-cache/src/services/change-streamer/shard-sampling.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/shard-sampling.js +19 -0
- package/out/zero-cache/src/services/change-streamer/shard-sampling.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +11 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +38 -5
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts +25 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js +95 -12
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.d.ts +83 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js +417 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.d.ts +73 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.js +157 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js +8 -3
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +63 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +217 -49
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +8 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +10 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +29 -0
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +154 -0
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +1 -0
- package/out/zero-cache/src/services/http-service.d.ts +1 -0
- package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/http-service.js +7 -3
- package/out/zero-cache/src/services/http-service.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +16 -7
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/litestream/config-v5.yml +15 -1
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +131 -0
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -0
- package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +70 -0
- package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +1 -0
- package/out/zero-cache/src/services/litestream/litestream-controller.js +101 -0
- package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -0
- package/out/zero-cache/src/services/litestream/metrics.d.ts +1 -0
- package/out/zero-cache/src/services/litestream/metrics.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/metrics.js +4 -1
- package/out/zero-cache/src/services/litestream/metrics.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-db.d.ts +10 -0
- package/out/zero-cache/src/services/replicator/change-log-db.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-db.js +15 -1
- package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +18 -21
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js +2 -6
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js +2 -2
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +3 -2
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +8 -6
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +27 -2
- package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.js +3 -2
- package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker.js +24 -5
- package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +3 -2
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +25 -17
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +14 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +3 -3
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +6 -2
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/downstream.d.ts +11 -0
- package/out/zero-cache/src/types/downstream.d.ts.map +1 -0
- package/out/zero-cache/src/types/pg.d.ts +15 -2
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +21 -8
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/types/poke-chunk.d.ts +18 -0
- package/out/zero-cache/src/types/poke-chunk.d.ts.map +1 -0
- package/out/zero-cache/src/types/poke-chunk.js +57 -0
- package/out/zero-cache/src/types/poke-chunk.js.map +1 -0
- package/out/zero-cache/src/types/processes.js +1 -4
- package/out/zero-cache/src/types/processes.js.map +1 -1
- package/out/zero-cache/src/types/streams.d.ts +4 -9
- package/out/zero-cache/src/types/streams.d.ts.map +1 -1
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-cache/src/types/subscription.d.ts +2 -11
- package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
- package/out/zero-cache/src/types/subscription.js +4 -25
- package/out/zero-cache/src/types/subscription.js.map +1 -1
- package/out/zero-cache/src/workers/connection.d.ts +22 -4
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +112 -14
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.d.ts +1 -0
- package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/workers/replicator.js +4 -2
- package/out/zero-cache/src/workers/replicator.js.map +1 -1
- package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-manager.js +46 -0
- package/out/zero-client/src/client/connection-manager.js.map +1 -1
- package/out/zero-client/src/client/context.d.ts +15 -0
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/context.js +44 -0
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.js +19 -12
- package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
- package/out/zero-client/src/client/ivm-branch.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero-poke-handler.d.ts +7 -2
- package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-poke-handler.js +52 -2
- package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
- package/out/zero-client/src/client/zero-rep.d.ts +1 -0
- package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-rep.js +9 -6
- package/out/zero-client/src/client/zero-rep.js.map +1 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +98 -25
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-protocol/src/custom-queries.d.ts +1 -1
- package/out/zero-protocol/src/down.d.ts +1 -1
- package/out/zero-protocol/src/error.d.ts +4 -4
- package/out/zero-protocol/src/inspect-down.js +1 -1
- package/out/zero-protocol/src/mutate-server.d.ts +2 -2
- package/out/zero-protocol/src/poke.d.ts +89 -7
- package/out/zero-protocol/src/poke.d.ts.map +1 -1
- package/out/zero-protocol/src/poke.js +16 -8
- package/out/zero-protocol/src/poke.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts +12 -7
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-protocol/src/push.d.ts +1 -1
- package/out/zero-protocol/src/query-server.d.ts +2 -2
- package/out/zql/src/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/ivm/array-view.js +5 -3
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/data.d.ts.map +1 -1
- package/out/zql/src/ivm/data.js +8 -3
- package/out/zql/src/ivm/data.js.map +1 -1
- package/out/zql/src/ivm/deferred-input.d.ts +44 -0
- package/out/zql/src/ivm/deferred-input.d.ts.map +1 -0
- package/out/zql/src/ivm/deferred-input.js +88 -0
- package/out/zql/src/ivm/deferred-input.js.map +1 -0
- package/out/zql/src/ivm/memory-source.d.ts +10 -2
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +19 -16
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/stream.d.ts +0 -1
- package/out/zql/src/ivm/stream.d.ts.map +1 -1
- package/out/zql/src/ivm/stream.js +1 -7
- package/out/zql/src/ivm/stream.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +11 -2
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.js +6 -1
- package/out/zql/src/ivm/view-apply-change.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.d.ts +6 -0
- package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
- package/out/zql/src/query/query-delegate-base.js +73 -10
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-delegate.d.ts +22 -0
- package/out/zql/src/query/query-delegate.d.ts.map +1 -1
- package/out/zqlite/src/query-builder.d.ts.map +1 -1
- package/out/zqlite/src/query-builder.js +2 -1
- package/out/zqlite/src/query-builder.js.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.js +1 -0
- package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts +1 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +3 -2
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +2 -3
- package/out/zero-cache/src/server/backup-watermark-poller.js +0 -31
- package/out/zero-cache/src/server/backup-watermark-poller.js.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts +0 -57
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js +0 -137
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js.map +0 -1
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
//#region ../zero-cache/src/services/change-source/pg/schema/index-predicate.ts
|
|
2
|
+
var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
3
|
+
var INTEGER_RE = /^[+-]?\d+$/;
|
|
4
|
+
var WHITESPACE_RE = /\s/;
|
|
5
|
+
var OPERATOR_TOKEN_RE = /^(?:::|<>|!=|<=|>=|=|<|>)/;
|
|
6
|
+
var UNSUPPORTED_OPERATOR_TOKEN_RE = /^(?:!~\*|!~|~\*|~)/;
|
|
7
|
+
var INTEGER_TOKEN_RE = /^[+-]?\d+/;
|
|
8
|
+
var WORD_TOKEN_RE = /^[A-Za-z_][A-Za-z0-9_$]*/;
|
|
9
|
+
var SIMPLE_ESCAPES = {
|
|
10
|
+
b: "\b",
|
|
11
|
+
f: "\f",
|
|
12
|
+
n: "\n",
|
|
13
|
+
r: "\r",
|
|
14
|
+
t: " ",
|
|
15
|
+
v: "\v"
|
|
16
|
+
};
|
|
17
|
+
var UnsupportedPredicateError = class extends Error {
|
|
18
|
+
reason;
|
|
19
|
+
constructor(reason) {
|
|
20
|
+
super(reason);
|
|
21
|
+
this.reason = reason;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
function translatePostgresIndexPredicate(sql, table) {
|
|
25
|
+
try {
|
|
26
|
+
const parser = new Parser(tokenize(sql));
|
|
27
|
+
const expression = parser.parse();
|
|
28
|
+
parser.expect("EOF");
|
|
29
|
+
return {
|
|
30
|
+
supported: true,
|
|
31
|
+
predicate: normalize(expression, table)
|
|
32
|
+
};
|
|
33
|
+
} catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
supported: false,
|
|
36
|
+
reason: error instanceof UnsupportedPredicateError ? error.reason : "unsupported-syntax"
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
var Parser = class {
|
|
41
|
+
#tokens;
|
|
42
|
+
#position = 0;
|
|
43
|
+
constructor(tokens) {
|
|
44
|
+
this.#tokens = tokens;
|
|
45
|
+
}
|
|
46
|
+
parse() {
|
|
47
|
+
return this.#parseOr();
|
|
48
|
+
}
|
|
49
|
+
#parseOr() {
|
|
50
|
+
const expressions = [this.#parseAnd()];
|
|
51
|
+
while (this.#take("OR")) expressions.push(this.#parseAnd());
|
|
52
|
+
return expressions.length === 1 ? expressions[0] : {
|
|
53
|
+
type: "or",
|
|
54
|
+
expressions
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
#parseAnd() {
|
|
58
|
+
const expressions = [this.#parseNot()];
|
|
59
|
+
while (this.#take("AND")) expressions.push(this.#parseNot());
|
|
60
|
+
return expressions.length === 1 ? expressions[0] : {
|
|
61
|
+
type: "and",
|
|
62
|
+
expressions
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
#parseNot() {
|
|
66
|
+
if (this.#take("NOT")) return {
|
|
67
|
+
type: "not",
|
|
68
|
+
expression: this.#parseNot()
|
|
69
|
+
};
|
|
70
|
+
return this.#parseComparison();
|
|
71
|
+
}
|
|
72
|
+
#parseComparison() {
|
|
73
|
+
const left = this.#parseOperand();
|
|
74
|
+
if (this.#take("IS")) {
|
|
75
|
+
const not = this.#take("NOT");
|
|
76
|
+
const token = this.#tokens[this.#position++];
|
|
77
|
+
if (token?.type !== "literal" || token.literalType !== "null") throw new UnsupportedPredicateError("unsupported-operator");
|
|
78
|
+
return {
|
|
79
|
+
type: "null-test",
|
|
80
|
+
expression: left,
|
|
81
|
+
not
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (this.#take("IN")) {
|
|
85
|
+
this.expect("(");
|
|
86
|
+
const values = this.#parseOperandList(")");
|
|
87
|
+
this.expect(")");
|
|
88
|
+
return comparisons(left, values);
|
|
89
|
+
}
|
|
90
|
+
const op = this.#tokens[this.#position]?.type;
|
|
91
|
+
if (isComparison(op)) {
|
|
92
|
+
this.#position++;
|
|
93
|
+
if (op === "=" && this.#takeIdentifier("ANY")) return comparisons(left, this.#parseLiteralArray());
|
|
94
|
+
return {
|
|
95
|
+
type: "comparison",
|
|
96
|
+
left,
|
|
97
|
+
op,
|
|
98
|
+
right: this.#parseOperand()
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const next = this.#tokens[this.#position];
|
|
102
|
+
if (next?.type === "identifier" && next.value.toUpperCase() === "COLLATE") throw new UnsupportedPredicateError("non-deterministic-collation");
|
|
103
|
+
if (next?.type === "unsupported" && UNSUPPORTED_OPERATOR_TOKEN_RE.test(next.value)) throw new UnsupportedPredicateError("unsupported-operator");
|
|
104
|
+
if (next?.type === "identifier" && unsupportedOperatorWords.has(next.value.toUpperCase())) throw new UnsupportedPredicateError("unsupported-operator");
|
|
105
|
+
return left;
|
|
106
|
+
}
|
|
107
|
+
#parseLiteralArray() {
|
|
108
|
+
this.expect("(");
|
|
109
|
+
this.#expectIdentifier("ARRAY");
|
|
110
|
+
this.expect("[");
|
|
111
|
+
const values = this.#parseOperandList("]");
|
|
112
|
+
this.expect("]");
|
|
113
|
+
if (this.#take("::")) {
|
|
114
|
+
this.#parseCastName();
|
|
115
|
+
this.expect("[");
|
|
116
|
+
this.expect("]");
|
|
117
|
+
}
|
|
118
|
+
this.expect(")");
|
|
119
|
+
return values;
|
|
120
|
+
}
|
|
121
|
+
#parseOperandList(end) {
|
|
122
|
+
const values = [];
|
|
123
|
+
if (this.#tokens[this.#position]?.type === end) return values;
|
|
124
|
+
values.push(this.#parseOperand());
|
|
125
|
+
while (this.#take(",")) values.push(this.#parseOperand());
|
|
126
|
+
return values;
|
|
127
|
+
}
|
|
128
|
+
#parseOperand() {
|
|
129
|
+
let expression = this.#parsePrimary();
|
|
130
|
+
while (this.#take("::")) expression = {
|
|
131
|
+
type: "cast",
|
|
132
|
+
expression,
|
|
133
|
+
cast: this.#parseCastName()
|
|
134
|
+
};
|
|
135
|
+
return expression;
|
|
136
|
+
}
|
|
137
|
+
#parsePrimary() {
|
|
138
|
+
if (this.#take("(")) {
|
|
139
|
+
const expression = this.#parseOr();
|
|
140
|
+
this.expect(")");
|
|
141
|
+
return expression;
|
|
142
|
+
}
|
|
143
|
+
const token = this.#tokens[this.#position++];
|
|
144
|
+
if (token?.type === "literal") return {
|
|
145
|
+
type: "literal",
|
|
146
|
+
value: token.value,
|
|
147
|
+
literalType: token.literalType
|
|
148
|
+
};
|
|
149
|
+
if (token?.type === "identifier") {
|
|
150
|
+
if (this.#tokens[this.#position]?.type === "(") throw new UnsupportedPredicateError("unsupported-function");
|
|
151
|
+
if (this.#tokens[this.#position]?.type === ".") throw new UnsupportedPredicateError("unsupported-syntax");
|
|
152
|
+
if (token.value.toUpperCase() === "COLLATE") throw new UnsupportedPredicateError("non-deterministic-collation");
|
|
153
|
+
return {
|
|
154
|
+
type: "column",
|
|
155
|
+
name: token.value
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
throw new UnsupportedPredicateError("unsupported-syntax");
|
|
159
|
+
}
|
|
160
|
+
#parseCastName() {
|
|
161
|
+
const first = this.#expectIdentifier();
|
|
162
|
+
const parts = [first];
|
|
163
|
+
let separator = ".";
|
|
164
|
+
while (this.#take(".")) parts.push(this.#expectIdentifier());
|
|
165
|
+
const next = this.#tokens[this.#position];
|
|
166
|
+
if (first.toLowerCase() === "character" && next?.type === "identifier" && next.value.toLowerCase() === "varying") {
|
|
167
|
+
parts.push(this.#expectIdentifier());
|
|
168
|
+
separator = " ";
|
|
169
|
+
}
|
|
170
|
+
if (this.#tokens[this.#position]?.type === "(") throw new UnsupportedPredicateError("unsupported-cast");
|
|
171
|
+
return parts.join(separator);
|
|
172
|
+
}
|
|
173
|
+
#expectIdentifier(expected) {
|
|
174
|
+
const token = this.#tokens[this.#position++];
|
|
175
|
+
if (token?.type !== "identifier" || expected !== void 0 && token.value.toUpperCase() !== expected) throw new UnsupportedPredicateError("unsupported-cast");
|
|
176
|
+
return token.value;
|
|
177
|
+
}
|
|
178
|
+
#takeIdentifier(expected) {
|
|
179
|
+
const token = this.#tokens[this.#position];
|
|
180
|
+
if (token?.type !== "identifier" || token.value.toUpperCase() !== expected) return false;
|
|
181
|
+
this.#position++;
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
#take(type) {
|
|
185
|
+
if (this.#tokens[this.#position]?.type !== type) return false;
|
|
186
|
+
this.#position++;
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
expect(type) {
|
|
190
|
+
if (!this.#take(type)) throw new UnsupportedPredicateError("unsupported-syntax");
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
var unsupportedOperatorWords = new Set([
|
|
194
|
+
"ALL",
|
|
195
|
+
"BETWEEN",
|
|
196
|
+
"ILIKE",
|
|
197
|
+
"LIKE",
|
|
198
|
+
"SIMILAR"
|
|
199
|
+
]);
|
|
200
|
+
function comparisons(left, values) {
|
|
201
|
+
if (values.length === 0) throw new UnsupportedPredicateError("unsupported-syntax");
|
|
202
|
+
const expressions = values.map((right) => ({
|
|
203
|
+
type: "comparison",
|
|
204
|
+
left,
|
|
205
|
+
op: "=",
|
|
206
|
+
right
|
|
207
|
+
}));
|
|
208
|
+
return expressions.length === 1 ? expressions[0] : {
|
|
209
|
+
type: "or",
|
|
210
|
+
expressions
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function normalize(expression, table) {
|
|
214
|
+
switch (expression.type) {
|
|
215
|
+
case "and":
|
|
216
|
+
case "or": {
|
|
217
|
+
const conditions = expression.expressions.map((expr) => normalize(expr, table));
|
|
218
|
+
return {
|
|
219
|
+
type: expression.type,
|
|
220
|
+
conditions: conditions.flatMap((condition) => condition.type === expression.type ? condition.conditions : [condition])
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
case "not": {
|
|
224
|
+
const booleanColumn = resolveBareBooleanColumn(expression.expression, table);
|
|
225
|
+
if (booleanColumn) return booleanComparison(booleanColumn, false);
|
|
226
|
+
return {
|
|
227
|
+
type: "not",
|
|
228
|
+
condition: normalize(expression.expression, table)
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
case "column": {
|
|
232
|
+
const column = resolveColumn(expression, table);
|
|
233
|
+
if (column.category !== "boolean") throw new UnsupportedPredicateError("unsupported-type");
|
|
234
|
+
return booleanComparison(column.name, true);
|
|
235
|
+
}
|
|
236
|
+
case "cast": {
|
|
237
|
+
const column = resolveColumnOperand(expression, table);
|
|
238
|
+
if (column.category !== "boolean") throw new UnsupportedPredicateError("unsupported-type");
|
|
239
|
+
return booleanComparison(column.name, true);
|
|
240
|
+
}
|
|
241
|
+
case "null-test": return {
|
|
242
|
+
type: "null-test",
|
|
243
|
+
column: resolveNullTestColumn(expression.expression, table),
|
|
244
|
+
op: expression.not ? "IS NOT NULL" : "IS NULL"
|
|
245
|
+
};
|
|
246
|
+
case "comparison": return normalizeComparison(expression, table);
|
|
247
|
+
case "literal": throw new UnsupportedPredicateError("unsupported-syntax");
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
function resolveNullTestColumn(expression, table) {
|
|
251
|
+
if (expression.type === "cast") return resolveColumnOperand(expression, table).name;
|
|
252
|
+
if (expression.type === "column" && !table.columns[expression.name]) throw new UnsupportedPredicateError("unpublished-column");
|
|
253
|
+
if (expression.type === "column") return expression.name;
|
|
254
|
+
throw new UnsupportedPredicateError("unsupported-syntax");
|
|
255
|
+
}
|
|
256
|
+
function resolveBareBooleanColumn(expression, table) {
|
|
257
|
+
if (expression.type !== "column" && expression.type !== "cast") return;
|
|
258
|
+
const column = resolveColumnOperand(expression, table);
|
|
259
|
+
return column.category === "boolean" ? column.name : void 0;
|
|
260
|
+
}
|
|
261
|
+
function booleanComparison(column, value) {
|
|
262
|
+
return {
|
|
263
|
+
type: "comparison",
|
|
264
|
+
column,
|
|
265
|
+
op: "=",
|
|
266
|
+
value: {
|
|
267
|
+
type: "boolean",
|
|
268
|
+
value
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function normalizeComparison(expression, table) {
|
|
273
|
+
const column = resolveColumnOperand(expression.left, table);
|
|
274
|
+
const op = expression.op === "!=" ? "<>" : expression.op;
|
|
275
|
+
if (column.category !== "integer" && op !== "=" && op !== "<>") throw new UnsupportedPredicateError("unsupported-operator");
|
|
276
|
+
const value = resolveLiteral(expression.right, column);
|
|
277
|
+
return {
|
|
278
|
+
type: "comparison",
|
|
279
|
+
column: column.name,
|
|
280
|
+
op,
|
|
281
|
+
value
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function resolveColumnOperand(expression, table) {
|
|
285
|
+
if (expression.type === "column") return resolveColumn(expression, table);
|
|
286
|
+
if (expression.type !== "cast") throw new UnsupportedPredicateError("unsupported-syntax");
|
|
287
|
+
const column = resolveColumnOperand(expression.expression, table);
|
|
288
|
+
const cast = canonicalTypeName(expression.cast);
|
|
289
|
+
switch (column.category) {
|
|
290
|
+
case "integer": {
|
|
291
|
+
const rank = integerRank(cast);
|
|
292
|
+
if (rank === void 0 || rank < column.rank) throw new UnsupportedPredicateError("unsupported-cast");
|
|
293
|
+
return {
|
|
294
|
+
...column,
|
|
295
|
+
rank
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
case "text":
|
|
299
|
+
if (cast !== "text" && cast !== "varchar") throw new UnsupportedPredicateError("unsupported-cast");
|
|
300
|
+
return column;
|
|
301
|
+
case "boolean":
|
|
302
|
+
if (cast !== "bool") throw new UnsupportedPredicateError("unsupported-cast");
|
|
303
|
+
return column;
|
|
304
|
+
case "uuid":
|
|
305
|
+
if (cast !== "uuid") throw new UnsupportedPredicateError("unsupported-cast");
|
|
306
|
+
return column;
|
|
307
|
+
case "enum":
|
|
308
|
+
if (lastTypeName(expression.cast) !== column.enumName.toLowerCase()) throw new UnsupportedPredicateError("unsupported-cast");
|
|
309
|
+
return column;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function resolveColumn(expression, table) {
|
|
313
|
+
const spec = table.columns[expression.name];
|
|
314
|
+
if (!spec) throw new UnsupportedPredicateError("unpublished-column");
|
|
315
|
+
const dataType = canonicalTypeName(spec.dataType);
|
|
316
|
+
if (dataType === "bool") return {
|
|
317
|
+
category: "boolean",
|
|
318
|
+
name: expression.name
|
|
319
|
+
};
|
|
320
|
+
const rank = integerRank(dataType);
|
|
321
|
+
if (rank !== void 0) return {
|
|
322
|
+
category: "integer",
|
|
323
|
+
name: expression.name,
|
|
324
|
+
rank
|
|
325
|
+
};
|
|
326
|
+
if (dataType === "text" || dataType === "varchar") {
|
|
327
|
+
if (spec.collationIsDeterministic === false) throw new UnsupportedPredicateError("non-deterministic-collation");
|
|
328
|
+
return {
|
|
329
|
+
category: "text",
|
|
330
|
+
name: expression.name
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
if (dataType === "uuid") return {
|
|
334
|
+
category: "uuid",
|
|
335
|
+
name: expression.name
|
|
336
|
+
};
|
|
337
|
+
if (spec.pgTypeClass === "e") return {
|
|
338
|
+
category: "enum",
|
|
339
|
+
name: expression.name,
|
|
340
|
+
enumName: spec.dataType.toLowerCase()
|
|
341
|
+
};
|
|
342
|
+
throw new UnsupportedPredicateError("unsupported-type");
|
|
343
|
+
}
|
|
344
|
+
function resolveLiteral(expression, column) {
|
|
345
|
+
let literal = expression;
|
|
346
|
+
let cast;
|
|
347
|
+
while (literal.type === "cast") {
|
|
348
|
+
cast = literal.cast;
|
|
349
|
+
literal = literal.expression;
|
|
350
|
+
}
|
|
351
|
+
if (literal.type !== "literal" || literal.value === null) throw new UnsupportedPredicateError("unsupported-syntax");
|
|
352
|
+
switch (column.category) {
|
|
353
|
+
case "boolean":
|
|
354
|
+
validateLiteralCast(cast, new Set(["bool"]));
|
|
355
|
+
if (literal.literalType !== "boolean") throw new UnsupportedPredicateError("unsupported-type");
|
|
356
|
+
return {
|
|
357
|
+
type: "boolean",
|
|
358
|
+
value: literal.value
|
|
359
|
+
};
|
|
360
|
+
case "integer":
|
|
361
|
+
if (cast !== void 0) {
|
|
362
|
+
const castRank = integerRank(canonicalTypeName(cast));
|
|
363
|
+
if (castRank === void 0 || castRank > column.rank) throw new UnsupportedPredicateError("unsupported-cast");
|
|
364
|
+
}
|
|
365
|
+
if (literal.literalType !== "integer" && !(literal.literalType === "string" && cast !== void 0)) throw new UnsupportedPredicateError("unsupported-type");
|
|
366
|
+
return {
|
|
367
|
+
type: "integer",
|
|
368
|
+
value: canonicalInteger(String(literal.value), column.rank)
|
|
369
|
+
};
|
|
370
|
+
case "text":
|
|
371
|
+
validateLiteralCast(cast, new Set(["text", "varchar"]));
|
|
372
|
+
if (literal.literalType !== "string") throw new UnsupportedPredicateError("unsupported-type");
|
|
373
|
+
return {
|
|
374
|
+
type: "string",
|
|
375
|
+
value: String(literal.value)
|
|
376
|
+
};
|
|
377
|
+
case "enum":
|
|
378
|
+
if (cast !== void 0 && lastTypeName(cast) !== column.enumName.toLowerCase()) throw new UnsupportedPredicateError("unsupported-cast");
|
|
379
|
+
if (literal.literalType !== "string") throw new UnsupportedPredicateError("unsupported-type");
|
|
380
|
+
return {
|
|
381
|
+
type: "string",
|
|
382
|
+
value: String(literal.value)
|
|
383
|
+
};
|
|
384
|
+
case "uuid": {
|
|
385
|
+
validateLiteralCast(cast, new Set(["uuid"]));
|
|
386
|
+
const value = String(literal.value).toLowerCase();
|
|
387
|
+
if (literal.literalType !== "string" || !UUID_RE.test(value)) throw new UnsupportedPredicateError("unsupported-type");
|
|
388
|
+
return {
|
|
389
|
+
type: "string",
|
|
390
|
+
value
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
function validateLiteralCast(cast, allowed) {
|
|
396
|
+
if (cast !== void 0 && !allowed.has(canonicalTypeName(cast))) throw new UnsupportedPredicateError("unsupported-cast");
|
|
397
|
+
}
|
|
398
|
+
function canonicalInteger(value, rank) {
|
|
399
|
+
if (!INTEGER_RE.test(value)) throw new UnsupportedPredicateError("unsupported-type");
|
|
400
|
+
let integer;
|
|
401
|
+
try {
|
|
402
|
+
integer = BigInt(value);
|
|
403
|
+
} catch {
|
|
404
|
+
throw new UnsupportedPredicateError("unsupported-type");
|
|
405
|
+
}
|
|
406
|
+
const bounds = [
|
|
407
|
+
[-32768n, 32767n],
|
|
408
|
+
[-2147483648n, 2147483647n],
|
|
409
|
+
[-9223372036854775808n, 9223372036854775807n]
|
|
410
|
+
];
|
|
411
|
+
if (integer < bounds[rank][0] || integer > bounds[rank][1]) throw new UnsupportedPredicateError("unsupported-type");
|
|
412
|
+
return integer.toString();
|
|
413
|
+
}
|
|
414
|
+
function canonicalTypeName(type) {
|
|
415
|
+
const name = lastTypeName(type).replace(/\s+/g, " ");
|
|
416
|
+
switch (name) {
|
|
417
|
+
case "boolean": return "bool";
|
|
418
|
+
case "smallint": return "int2";
|
|
419
|
+
case "integer": return "int4";
|
|
420
|
+
case "bigint": return "int8";
|
|
421
|
+
case "character varying": return "varchar";
|
|
422
|
+
default: return name;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
function lastTypeName(type) {
|
|
426
|
+
return type.split(".").at(-1)?.toLowerCase() ?? "";
|
|
427
|
+
}
|
|
428
|
+
function integerRank(type) {
|
|
429
|
+
switch (type) {
|
|
430
|
+
case "int2": return 0;
|
|
431
|
+
case "int4": return 1;
|
|
432
|
+
case "int8": return 2;
|
|
433
|
+
default: return;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function isComparison(type) {
|
|
437
|
+
return type === "=" || type === "<>" || type === "!=" || type === "<" || type === "<=" || type === ">" || type === ">=";
|
|
438
|
+
}
|
|
439
|
+
function tokenize(sql) {
|
|
440
|
+
const tokens = [];
|
|
441
|
+
for (let i = 0; i < sql.length;) {
|
|
442
|
+
const char = sql[i];
|
|
443
|
+
if (WHITESPACE_RE.test(char)) {
|
|
444
|
+
i++;
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
if (char === "\"") {
|
|
448
|
+
const result = readQuoted(sql, i, "\"", false);
|
|
449
|
+
tokens.push({
|
|
450
|
+
type: "identifier",
|
|
451
|
+
value: result.value
|
|
452
|
+
});
|
|
453
|
+
i = result.end;
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
const escapeString = (char === "E" || char === "e") && sql[i + 1] === "'";
|
|
457
|
+
if (char === "'" || escapeString) {
|
|
458
|
+
const result = readQuoted(sql, i + (escapeString ? 1 : 0), "'", escapeString);
|
|
459
|
+
tokens.push({
|
|
460
|
+
type: "literal",
|
|
461
|
+
literalType: "string",
|
|
462
|
+
value: result.value
|
|
463
|
+
});
|
|
464
|
+
i = result.end;
|
|
465
|
+
continue;
|
|
466
|
+
}
|
|
467
|
+
const operator = OPERATOR_TOKEN_RE.exec(sql.slice(i))?.[0];
|
|
468
|
+
if (operator) {
|
|
469
|
+
tokens.push({ type: operator });
|
|
470
|
+
i += operator.length;
|
|
471
|
+
continue;
|
|
472
|
+
}
|
|
473
|
+
const unsupportedOperator = UNSUPPORTED_OPERATOR_TOKEN_RE.exec(sql.slice(i))?.[0];
|
|
474
|
+
if (unsupportedOperator) {
|
|
475
|
+
tokens.push({
|
|
476
|
+
type: "unsupported",
|
|
477
|
+
value: unsupportedOperator
|
|
478
|
+
});
|
|
479
|
+
i += unsupportedOperator.length;
|
|
480
|
+
continue;
|
|
481
|
+
}
|
|
482
|
+
if (char === "(" || char === ")" || char === "[" || char === "]" || char === "," || char === ".") {
|
|
483
|
+
tokens.push({ type: char });
|
|
484
|
+
i++;
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
const integer = INTEGER_TOKEN_RE.exec(sql.slice(i))?.[0];
|
|
488
|
+
if (integer) {
|
|
489
|
+
tokens.push({
|
|
490
|
+
type: "literal",
|
|
491
|
+
literalType: "integer",
|
|
492
|
+
value: integer
|
|
493
|
+
});
|
|
494
|
+
i += integer.length;
|
|
495
|
+
continue;
|
|
496
|
+
}
|
|
497
|
+
const word = WORD_TOKEN_RE.exec(sql.slice(i))?.[0];
|
|
498
|
+
if (word) {
|
|
499
|
+
const keyword = word.toUpperCase();
|
|
500
|
+
if (unsupportedOperatorWords.has(keyword)) throw new UnsupportedPredicateError("unsupported-operator");
|
|
501
|
+
if (keyword === "TRUE" || keyword === "FALSE") tokens.push({
|
|
502
|
+
type: "literal",
|
|
503
|
+
literalType: "boolean",
|
|
504
|
+
value: keyword === "TRUE"
|
|
505
|
+
});
|
|
506
|
+
else if (keyword === "NULL") tokens.push({
|
|
507
|
+
type: "literal",
|
|
508
|
+
literalType: "null",
|
|
509
|
+
value: null
|
|
510
|
+
});
|
|
511
|
+
else if (keyword === "AND" || keyword === "OR" || keyword === "NOT" || keyword === "IN" || keyword === "IS") tokens.push({ type: keyword });
|
|
512
|
+
else tokens.push({
|
|
513
|
+
type: "identifier",
|
|
514
|
+
value: word.toLowerCase()
|
|
515
|
+
});
|
|
516
|
+
i += word.length;
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
tokens.push({
|
|
520
|
+
type: "unsupported",
|
|
521
|
+
value: char
|
|
522
|
+
});
|
|
523
|
+
i++;
|
|
524
|
+
}
|
|
525
|
+
tokens.push({ type: "EOF" });
|
|
526
|
+
return tokens;
|
|
527
|
+
}
|
|
528
|
+
function readQuoted(sql, start, quote, escapes) {
|
|
529
|
+
let value = "";
|
|
530
|
+
for (let i = start + 1; i < sql.length; i++) {
|
|
531
|
+
const char = sql[i];
|
|
532
|
+
if (char === quote) if (sql[i + 1] === quote) {
|
|
533
|
+
value += quote;
|
|
534
|
+
i++;
|
|
535
|
+
} else return {
|
|
536
|
+
value,
|
|
537
|
+
end: i + 1
|
|
538
|
+
};
|
|
539
|
+
else if (escapes && char === "\\") {
|
|
540
|
+
const escape = sql[++i];
|
|
541
|
+
if (escape === void 0) throw new UnsupportedPredicateError("unsupported-syntax");
|
|
542
|
+
if (escape === "x") {
|
|
543
|
+
const hex = readEscapeDigits(sql, i + 1, 2, 16, 1);
|
|
544
|
+
value += String.fromCharCode(hex.value);
|
|
545
|
+
i = hex.end - 1;
|
|
546
|
+
} else if (escape === "u" || escape === "U") {
|
|
547
|
+
const hex = readEscapeDigits(sql, i + 1, escape === "u" ? 4 : 8, 16);
|
|
548
|
+
try {
|
|
549
|
+
value += String.fromCodePoint(hex.value);
|
|
550
|
+
} catch {
|
|
551
|
+
throw new UnsupportedPredicateError("unsupported-syntax");
|
|
552
|
+
}
|
|
553
|
+
i = hex.end - 1;
|
|
554
|
+
} else if (escape >= "0" && escape <= "7") {
|
|
555
|
+
let octal = escape;
|
|
556
|
+
while (octal.length < 3 && sql[i + 1] !== void 0 && sql[i + 1] >= "0" && sql[i + 1] <= "7") octal += sql[++i];
|
|
557
|
+
value += String.fromCharCode(Number.parseInt(octal, 8));
|
|
558
|
+
} else if (escape === "\n") {} else if (escape === "\r" && sql[i + 1] === "\n") i++;
|
|
559
|
+
else value += SIMPLE_ESCAPES[escape] ?? escape;
|
|
560
|
+
} else value += char;
|
|
561
|
+
}
|
|
562
|
+
throw new UnsupportedPredicateError("unsupported-syntax");
|
|
563
|
+
}
|
|
564
|
+
function readEscapeDigits(sql, start, length, radix, minLength = length) {
|
|
565
|
+
let end = start;
|
|
566
|
+
while (end < start + length) {
|
|
567
|
+
const digit = sql[end];
|
|
568
|
+
if (digit === void 0 || !(digit >= "0" && digit <= "9" || digit.toLowerCase() >= "a" && digit.toLowerCase() <= "f")) break;
|
|
569
|
+
end++;
|
|
570
|
+
}
|
|
571
|
+
const digits = sql.slice(start, end);
|
|
572
|
+
if (digits.length < minLength) throw new UnsupportedPredicateError("unsupported-syntax");
|
|
573
|
+
return {
|
|
574
|
+
value: Number.parseInt(digits, radix),
|
|
575
|
+
end
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
//#endregion
|
|
579
|
+
export { translatePostgresIndexPredicate };
|
|
580
|
+
|
|
581
|
+
//# sourceMappingURL=index-predicate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-predicate.js","names":["#tokens","#parseOr","#parseAnd","#take","#parseNot","#parseComparison","#parseOperand","#position","#parseOperandList","#takeIdentifier","#parseLiteralArray","#expectIdentifier","#parseCastName","#parsePrimary"],"sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/index-predicate.ts"],"sourcesContent":["import * as PostgresTypeClass from '../../../../db/postgres-type-class-enum.ts';\nimport type {\n IndexPredicate,\n IndexPredicateValue,\n PublishedTableSpec,\n} from '../../../../db/specs.ts';\n\nconst UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\nconst INTEGER_RE = /^[+-]?\\d+$/;\nconst WHITESPACE_RE = /\\s/;\nconst OPERATOR_TOKEN_RE = /^(?:::|<>|!=|<=|>=|=|<|>)/;\nconst UNSUPPORTED_OPERATOR_TOKEN_RE = /^(?:!~\\*|!~|~\\*|~)/;\nconst INTEGER_TOKEN_RE = /^[+-]?\\d+/;\nconst WORD_TOKEN_RE = /^[A-Za-z_][A-Za-z0-9_$]*/;\nconst SIMPLE_ESCAPES: Readonly<Record<string, string>> = {\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t',\n v: '\\v',\n};\n\nexport const unsupportedPredicateReasons = [\n 'unpublished-column',\n 'unsupported-type',\n 'unsupported-operator',\n 'unsupported-function',\n 'unsupported-cast',\n 'unsupported-syntax',\n 'non-deterministic-collation',\n] as const;\n\nexport type UnsupportedPredicateReason =\n (typeof unsupportedPredicateReasons)[number];\n\nexport type PredicateTranslation =\n | {readonly supported: true; readonly predicate: IndexPredicate}\n | {readonly supported: false; readonly reason: UnsupportedPredicateReason};\n\ntype PredicateColumnSpec = PublishedTableSpec['columns'][string] & {\n readonly collationIsDeterministic?: boolean | null | undefined;\n};\n\ntype PredicateTableSpec = Omit<PublishedTableSpec, 'columns'> & {\n readonly columns: Readonly<Record<string, PredicateColumnSpec>>;\n};\n\ntype Expr =\n | {readonly type: 'column'; readonly name: string}\n | {\n readonly type: 'literal';\n readonly value: boolean | string | null;\n readonly literalType: 'boolean' | 'integer' | 'string' | 'null';\n }\n | {readonly type: 'cast'; readonly expression: Expr; readonly cast: string}\n | {readonly type: 'not'; readonly expression: Expr}\n | {\n readonly type: 'and' | 'or';\n readonly expressions: readonly Expr[];\n }\n | {\n readonly type: 'comparison';\n readonly left: Expr;\n readonly op: '=' | '<>' | '!=' | '<' | '<=' | '>' | '>=';\n readonly right: Expr;\n }\n | {\n readonly type: 'null-test';\n readonly expression: Expr;\n readonly not: boolean;\n };\n\ntype Token =\n | {readonly type: 'identifier'; readonly value: string}\n | {\n readonly type: 'literal';\n readonly value: boolean | string | null;\n readonly literalType: 'boolean' | 'integer' | 'string' | 'null';\n }\n | {\n readonly type:\n | '('\n | ')'\n | '['\n | ']'\n | ','\n | '.'\n | '::'\n | '='\n | '<>'\n | '!='\n | '<'\n | '<='\n | '>'\n | '>='\n | 'AND'\n | 'OR'\n | 'NOT'\n | 'IN'\n | 'IS'\n | 'EOF';\n }\n | {readonly type: 'unsupported'; readonly value: string};\n\nclass UnsupportedPredicateError extends Error {\n readonly reason: UnsupportedPredicateReason;\n\n constructor(reason: UnsupportedPredicateReason) {\n super(reason);\n this.reason = reason;\n }\n}\n\nexport function translatePostgresIndexPredicate(\n sql: string,\n table: PredicateTableSpec,\n): PredicateTranslation {\n try {\n const parser = new Parser(tokenize(sql));\n const expression = parser.parse();\n parser.expect('EOF');\n return {supported: true, predicate: normalize(expression, table)};\n } catch (error) {\n return {\n supported: false,\n reason:\n error instanceof UnsupportedPredicateError\n ? error.reason\n : 'unsupported-syntax',\n };\n }\n}\n\nclass Parser {\n readonly #tokens: readonly Token[];\n #position = 0;\n\n constructor(tokens: readonly Token[]) {\n this.#tokens = tokens;\n }\n\n parse(): Expr {\n return this.#parseOr();\n }\n\n #parseOr(): Expr {\n const expressions = [this.#parseAnd()];\n while (this.#take('OR')) expressions.push(this.#parseAnd());\n return expressions.length === 1\n ? expressions[0]\n : {type: 'or', expressions};\n }\n\n #parseAnd(): Expr {\n const expressions = [this.#parseNot()];\n while (this.#take('AND')) expressions.push(this.#parseNot());\n return expressions.length === 1\n ? expressions[0]\n : {type: 'and', expressions};\n }\n\n #parseNot(): Expr {\n if (this.#take('NOT')) {\n return {type: 'not', expression: this.#parseNot()};\n }\n return this.#parseComparison();\n }\n\n #parseComparison(): Expr {\n const left = this.#parseOperand();\n if (this.#take('IS')) {\n const not = this.#take('NOT');\n const token = this.#tokens[this.#position++];\n if (token?.type !== 'literal' || token.literalType !== 'null') {\n throw new UnsupportedPredicateError('unsupported-operator');\n }\n return {type: 'null-test', expression: left, not};\n }\n if (this.#take('IN')) {\n this.expect('(');\n const values = this.#parseOperandList(')');\n this.expect(')');\n return comparisons(left, values);\n }\n const op = this.#tokens[this.#position]?.type;\n if (isComparison(op)) {\n this.#position++;\n if (op === '=' && this.#takeIdentifier('ANY')) {\n return comparisons(left, this.#parseLiteralArray());\n }\n return {\n type: 'comparison',\n left,\n op,\n right: this.#parseOperand(),\n };\n }\n const next = this.#tokens[this.#position];\n if (next?.type === 'identifier' && next.value.toUpperCase() === 'COLLATE') {\n throw new UnsupportedPredicateError('non-deterministic-collation');\n }\n if (\n next?.type === 'unsupported' &&\n UNSUPPORTED_OPERATOR_TOKEN_RE.test(next.value)\n ) {\n throw new UnsupportedPredicateError('unsupported-operator');\n }\n if (\n next?.type === 'identifier' &&\n unsupportedOperatorWords.has(next.value.toUpperCase())\n ) {\n throw new UnsupportedPredicateError('unsupported-operator');\n }\n return left;\n }\n\n #parseLiteralArray(): readonly Expr[] {\n this.expect('(');\n this.#expectIdentifier('ARRAY');\n this.expect('[');\n const values = this.#parseOperandList(']');\n this.expect(']');\n if (this.#take('::')) {\n this.#parseCastName();\n this.expect('[');\n this.expect(']');\n }\n this.expect(')');\n return values;\n }\n\n #parseOperandList(end: ')' | ']'): readonly Expr[] {\n const values: Expr[] = [];\n if (this.#tokens[this.#position]?.type === end) return values;\n values.push(this.#parseOperand());\n while (this.#take(',')) values.push(this.#parseOperand());\n return values;\n }\n\n #parseOperand(): Expr {\n let expression = this.#parsePrimary();\n while (this.#take('::')) {\n expression = {\n type: 'cast',\n expression,\n cast: this.#parseCastName(),\n };\n }\n return expression;\n }\n\n #parsePrimary(): Expr {\n if (this.#take('(')) {\n const expression = this.#parseOr();\n this.expect(')');\n return expression;\n }\n const token = this.#tokens[this.#position++];\n if (token?.type === 'literal') {\n return {\n type: 'literal',\n value: token.value,\n literalType: token.literalType,\n };\n }\n if (token?.type === 'identifier') {\n if (this.#tokens[this.#position]?.type === '(') {\n throw new UnsupportedPredicateError('unsupported-function');\n }\n if (this.#tokens[this.#position]?.type === '.') {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n if (token.value.toUpperCase() === 'COLLATE') {\n throw new UnsupportedPredicateError('non-deterministic-collation');\n }\n return {type: 'column', name: token.value};\n }\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n\n #parseCastName(): string {\n const first = this.#expectIdentifier();\n const parts = [first];\n let separator = '.';\n while (this.#take('.')) parts.push(this.#expectIdentifier());\n const next = this.#tokens[this.#position];\n if (\n first.toLowerCase() === 'character' &&\n next?.type === 'identifier' &&\n next.value.toLowerCase() === 'varying'\n ) {\n parts.push(this.#expectIdentifier());\n separator = ' ';\n }\n if (this.#tokens[this.#position]?.type === '(') {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return parts.join(separator);\n }\n\n #expectIdentifier(expected?: string): string {\n const token = this.#tokens[this.#position++];\n if (\n token?.type !== 'identifier' ||\n (expected !== undefined && token.value.toUpperCase() !== expected)\n ) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return token.value;\n }\n\n #takeIdentifier(expected: string): boolean {\n const token = this.#tokens[this.#position];\n if (\n token?.type !== 'identifier' ||\n token.value.toUpperCase() !== expected\n ) {\n return false;\n }\n this.#position++;\n return true;\n }\n\n #take(type: Token['type']): boolean {\n if (this.#tokens[this.#position]?.type !== type) return false;\n this.#position++;\n return true;\n }\n\n expect(type: Token['type']): void {\n if (!this.#take(type)) {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n }\n}\n\nconst unsupportedOperatorWords = new Set([\n 'ALL',\n 'BETWEEN',\n 'ILIKE',\n 'LIKE',\n 'SIMILAR',\n]);\n\nfunction comparisons(left: Expr, values: readonly Expr[]): Expr {\n if (values.length === 0) {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n const expressions = values.map(\n right => ({type: 'comparison', left, op: '=', right}) as const,\n );\n return expressions.length === 1 ? expressions[0] : {type: 'or', expressions};\n}\n\nfunction normalize(\n expression: Expr,\n table: PredicateTableSpec,\n): IndexPredicate {\n switch (expression.type) {\n case 'and':\n case 'or': {\n const conditions = expression.expressions.map(expr =>\n normalize(expr, table),\n );\n return {\n type: expression.type,\n conditions: conditions.flatMap(condition =>\n condition.type === expression.type\n ? condition.conditions\n : [condition],\n ),\n };\n }\n case 'not': {\n const booleanColumn = resolveBareBooleanColumn(\n expression.expression,\n table,\n );\n if (booleanColumn) {\n return booleanComparison(booleanColumn, false);\n }\n return {type: 'not', condition: normalize(expression.expression, table)};\n }\n case 'column': {\n const column = resolveColumn(expression, table);\n if (column.category !== 'boolean') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return booleanComparison(column.name, true);\n }\n case 'cast': {\n const column = resolveColumnOperand(expression, table);\n if (column.category !== 'boolean') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return booleanComparison(column.name, true);\n }\n case 'null-test': {\n const column = resolveNullTestColumn(expression.expression, table);\n return {\n type: 'null-test',\n column,\n op: expression.not ? 'IS NOT NULL' : 'IS NULL',\n };\n }\n case 'comparison':\n return normalizeComparison(expression, table);\n case 'literal':\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n}\n\nfunction resolveNullTestColumn(\n expression: Expr,\n table: PredicateTableSpec,\n): string {\n if (expression.type === 'cast') {\n return resolveColumnOperand(expression, table).name;\n }\n if (expression.type === 'column' && !table.columns[expression.name]) {\n throw new UnsupportedPredicateError('unpublished-column');\n }\n if (expression.type === 'column') return expression.name;\n throw new UnsupportedPredicateError('unsupported-syntax');\n}\n\nfunction resolveBareBooleanColumn(\n expression: Expr,\n table: PredicateTableSpec,\n): string | undefined {\n if (expression.type !== 'column' && expression.type !== 'cast') {\n return undefined;\n }\n const column = resolveColumnOperand(expression, table);\n return column.category === 'boolean' ? column.name : undefined;\n}\n\nfunction booleanComparison(column: string, value: boolean): IndexPredicate {\n return {\n type: 'comparison',\n column,\n op: '=',\n value: {type: 'boolean', value},\n };\n}\n\ntype ColumnCategory =\n | {readonly category: 'boolean'; readonly name: string}\n | {\n readonly category: 'integer';\n readonly name: string;\n readonly rank: 0 | 1 | 2;\n }\n | {readonly category: 'text'; readonly name: string}\n | {\n readonly category: 'enum';\n readonly name: string;\n readonly enumName: string;\n }\n | {readonly category: 'uuid'; readonly name: string};\n\nfunction normalizeComparison(\n expression: Extract<Expr, {type: 'comparison'}>,\n table: PredicateTableSpec,\n): IndexPredicate {\n const column = resolveColumnOperand(expression.left, table);\n const op = expression.op === '!=' ? '<>' : expression.op;\n if (column.category !== 'integer' && op !== '=' && op !== '<>') {\n throw new UnsupportedPredicateError('unsupported-operator');\n }\n const value = resolveLiteral(expression.right, column);\n return {type: 'comparison', column: column.name, op, value};\n}\n\nfunction resolveColumnOperand(\n expression: Expr,\n table: PredicateTableSpec,\n): ColumnCategory {\n if (expression.type === 'column') return resolveColumn(expression, table);\n if (expression.type !== 'cast') {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n const column = resolveColumnOperand(expression.expression, table);\n const cast = canonicalTypeName(expression.cast);\n switch (column.category) {\n case 'integer': {\n const rank = integerRank(cast);\n if (rank === undefined || rank < column.rank) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return {...column, rank};\n }\n case 'text':\n if (cast !== 'text' && cast !== 'varchar') {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return column;\n case 'boolean':\n if (cast !== 'bool') {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return column;\n case 'uuid':\n if (cast !== 'uuid') {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return column;\n case 'enum':\n if (lastTypeName(expression.cast) !== column.enumName.toLowerCase()) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return column;\n }\n}\n\nfunction resolveColumn(\n expression: Extract<Expr, {type: 'column'}>,\n table: PredicateTableSpec,\n): ColumnCategory {\n const spec = table.columns[expression.name];\n if (!spec) throw new UnsupportedPredicateError('unpublished-column');\n const dataType = canonicalTypeName(spec.dataType);\n if (dataType === 'bool') return {category: 'boolean', name: expression.name};\n const rank = integerRank(dataType);\n if (rank !== undefined) {\n return {category: 'integer', name: expression.name, rank};\n }\n if (dataType === 'text' || dataType === 'varchar') {\n if (spec.collationIsDeterministic === false) {\n throw new UnsupportedPredicateError('non-deterministic-collation');\n }\n return {category: 'text', name: expression.name};\n }\n if (dataType === 'uuid') return {category: 'uuid', name: expression.name};\n if (spec.pgTypeClass === PostgresTypeClass.Enum) {\n return {\n category: 'enum',\n name: expression.name,\n enumName: spec.dataType.toLowerCase(),\n };\n }\n throw new UnsupportedPredicateError('unsupported-type');\n}\n\nfunction resolveLiteral(\n expression: Expr,\n column: ColumnCategory,\n): IndexPredicateValue {\n let literal = expression;\n let cast: string | undefined;\n while (literal.type === 'cast') {\n cast = literal.cast;\n literal = literal.expression;\n }\n if (literal.type !== 'literal' || literal.value === null) {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n\n switch (column.category) {\n case 'boolean': {\n validateLiteralCast(cast, new Set(['bool']));\n if (literal.literalType !== 'boolean') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {type: 'boolean', value: literal.value as boolean};\n }\n case 'integer': {\n if (cast !== undefined) {\n const castRank = integerRank(canonicalTypeName(cast));\n if (castRank === undefined || castRank > column.rank) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n }\n if (\n literal.literalType !== 'integer' &&\n !(literal.literalType === 'string' && cast !== undefined)\n ) {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {\n type: 'integer',\n value: canonicalInteger(String(literal.value), column.rank),\n };\n }\n case 'text':\n validateLiteralCast(cast, new Set(['text', 'varchar']));\n if (literal.literalType !== 'string') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {type: 'string', value: String(literal.value)};\n case 'enum':\n if (\n cast !== undefined &&\n lastTypeName(cast) !== column.enumName.toLowerCase()\n ) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n if (literal.literalType !== 'string') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {type: 'string', value: String(literal.value)};\n case 'uuid': {\n validateLiteralCast(cast, new Set(['uuid']));\n const value = String(literal.value).toLowerCase();\n if (literal.literalType !== 'string' || !UUID_RE.test(value)) {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {type: 'string', value};\n }\n }\n}\n\nfunction validateLiteralCast(\n cast: string | undefined,\n allowed: ReadonlySet<string>,\n): void {\n if (cast !== undefined && !allowed.has(canonicalTypeName(cast))) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n}\n\nfunction canonicalInteger(value: string, rank: 0 | 1 | 2): string {\n if (!INTEGER_RE.test(value)) {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n let integer: bigint;\n try {\n integer = BigInt(value);\n } catch {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n const bounds = [\n [-32768n, 32767n],\n [-2147483648n, 2147483647n],\n [-9223372036854775808n, 9223372036854775807n],\n ] as const;\n if (integer < bounds[rank][0] || integer > bounds[rank][1]) {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return integer.toString();\n}\n\nfunction canonicalTypeName(type: string): string {\n const name = lastTypeName(type).replace(/\\s+/g, ' ');\n switch (name) {\n case 'boolean':\n return 'bool';\n case 'smallint':\n return 'int2';\n case 'integer':\n return 'int4';\n case 'bigint':\n return 'int8';\n case 'character varying':\n return 'varchar';\n default:\n return name;\n }\n}\n\nfunction lastTypeName(type: string): string {\n return type.split('.').at(-1)?.toLowerCase() ?? '';\n}\n\nfunction integerRank(type: string): 0 | 1 | 2 | undefined {\n switch (type) {\n case 'int2':\n return 0;\n case 'int4':\n return 1;\n case 'int8':\n return 2;\n default:\n return undefined;\n }\n}\n\nfunction isComparison(\n type: Token['type'] | undefined,\n): type is '=' | '<>' | '!=' | '<' | '<=' | '>' | '>=' {\n return (\n type === '=' ||\n type === '<>' ||\n type === '!=' ||\n type === '<' ||\n type === '<=' ||\n type === '>' ||\n type === '>='\n );\n}\n\nfunction tokenize(sql: string): readonly Token[] {\n const tokens: Token[] = [];\n for (let i = 0; i < sql.length; ) {\n const char = sql[i];\n if (WHITESPACE_RE.test(char)) {\n i++;\n continue;\n }\n if (char === '\"') {\n const result = readQuoted(sql, i, '\"', false);\n tokens.push({type: 'identifier', value: result.value});\n i = result.end;\n continue;\n }\n const escapeString = (char === 'E' || char === 'e') && sql[i + 1] === \"'\";\n if (char === \"'\" || escapeString) {\n const result = readQuoted(\n sql,\n i + (escapeString ? 1 : 0),\n \"'\",\n escapeString,\n );\n tokens.push({\n type: 'literal',\n literalType: 'string',\n value: result.value,\n });\n i = result.end;\n continue;\n }\n const operator = OPERATOR_TOKEN_RE.exec(sql.slice(i))?.[0];\n if (operator) {\n tokens.push({\n type: operator as '::' | '=' | '<>' | '!=' | '<' | '<=' | '>' | '>=',\n });\n i += operator.length;\n continue;\n }\n const unsupportedOperator = UNSUPPORTED_OPERATOR_TOKEN_RE.exec(\n sql.slice(i),\n )?.[0];\n if (unsupportedOperator) {\n tokens.push({type: 'unsupported', value: unsupportedOperator});\n i += unsupportedOperator.length;\n continue;\n }\n if (\n char === '(' ||\n char === ')' ||\n char === '[' ||\n char === ']' ||\n char === ',' ||\n char === '.'\n ) {\n tokens.push({type: char});\n i++;\n continue;\n }\n const integer = INTEGER_TOKEN_RE.exec(sql.slice(i))?.[0];\n if (integer) {\n tokens.push({type: 'literal', literalType: 'integer', value: integer});\n i += integer.length;\n continue;\n }\n const word = WORD_TOKEN_RE.exec(sql.slice(i))?.[0];\n if (word) {\n const keyword = word.toUpperCase();\n if (unsupportedOperatorWords.has(keyword)) {\n throw new UnsupportedPredicateError('unsupported-operator');\n }\n if (keyword === 'TRUE' || keyword === 'FALSE') {\n tokens.push({\n type: 'literal',\n literalType: 'boolean',\n value: keyword === 'TRUE',\n });\n } else if (keyword === 'NULL') {\n tokens.push({type: 'literal', literalType: 'null', value: null});\n } else if (\n keyword === 'AND' ||\n keyword === 'OR' ||\n keyword === 'NOT' ||\n keyword === 'IN' ||\n keyword === 'IS'\n ) {\n tokens.push({type: keyword});\n } else {\n tokens.push({type: 'identifier', value: word.toLowerCase()});\n }\n i += word.length;\n continue;\n }\n tokens.push({type: 'unsupported', value: char});\n i++;\n }\n tokens.push({type: 'EOF'});\n return tokens;\n}\n\nfunction readQuoted(\n sql: string,\n start: number,\n quote: '\"' | \"'\",\n escapes: boolean,\n): {readonly value: string; readonly end: number} {\n let value = '';\n for (let i = start + 1; i < sql.length; i++) {\n const char = sql[i];\n if (char === quote) {\n if (sql[i + 1] === quote) {\n value += quote;\n i++;\n } else {\n return {value, end: i + 1};\n }\n } else if (escapes && char === '\\\\') {\n const escape = sql[++i];\n if (escape === undefined) {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n if (escape === 'x') {\n const hex = readEscapeDigits(sql, i + 1, 2, 16, 1);\n value += String.fromCharCode(hex.value);\n i = hex.end - 1;\n } else if (escape === 'u' || escape === 'U') {\n const hex = readEscapeDigits(sql, i + 1, escape === 'u' ? 4 : 8, 16);\n try {\n value += String.fromCodePoint(hex.value);\n } catch {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n i = hex.end - 1;\n } else if (escape >= '0' && escape <= '7') {\n let octal = escape;\n while (\n octal.length < 3 &&\n sql[i + 1] !== undefined &&\n sql[i + 1] >= '0' &&\n sql[i + 1] <= '7'\n ) {\n octal += sql[++i];\n }\n value += String.fromCharCode(Number.parseInt(octal, 8));\n } else if (escape === '\\n') {\n // A backslash-newline pair is a line continuation.\n } else if (escape === '\\r' && sql[i + 1] === '\\n') {\n i++;\n } else {\n value += SIMPLE_ESCAPES[escape] ?? escape;\n }\n } else {\n value += char;\n }\n }\n throw new UnsupportedPredicateError('unsupported-syntax');\n}\n\nfunction readEscapeDigits(\n sql: string,\n start: number,\n length: number,\n radix: 16,\n minLength = length,\n): {readonly value: number; readonly end: number} {\n let end = start;\n while (end < start + length) {\n const digit = sql[end];\n if (\n digit === undefined ||\n !(\n (digit >= '0' && digit <= '9') ||\n (digit.toLowerCase() >= 'a' && digit.toLowerCase() <= 'f')\n )\n ) {\n break;\n }\n end++;\n }\n const digits = sql.slice(start, end);\n if (digits.length < minLength) {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n return {value: Number.parseInt(digits, radix), end};\n}\n"],"mappings":"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"}
|
|
@@ -4,6 +4,6 @@ import { type ShardConfig } from '../../../../types/shards.ts';
|
|
|
4
4
|
/**
|
|
5
5
|
* Ensures that a shard is set up for initial sync.
|
|
6
6
|
*/
|
|
7
|
-
export declare function ensureShardSchema(lc: LogContext, db: PostgresDB, shard: ShardConfig): Promise<void>;
|
|
7
|
+
export declare function ensureShardSchema(lc: LogContext, db: PostgresDB, shard: ShardConfig, installPartialIndexTriggers?: boolean): Promise<void>;
|
|
8
8
|
export declare const CURRENT_SCHEMA_VERSION: number;
|
|
9
9
|
//# sourceMappingURL=init.d.ts.map
|